Метамодель JOOQ: почему нет Table.rename(String)?

Я динамически создаю и использую физические таблицы БД, для которых у меня есть только один объект метамодели. Пример: у меня есть один класс JOOQ Customer в моей метамодели, но у меня есть CUSTOMER1, CUSTOMER2 и т. д. во время выполнения. Я хотел бы написать строго типизированные запросы JOOQ для этих динамических таблиц. Следующее, кажется, делает трюк:

Customer CUSTOMER1 = Customer.rename("CUSTOMER1")

Конечно, есть целая куча таблиц, для которых мне нужно это сделать. К сожалению, я не могу использовать метод rename в общем, потому что он не является частью интерфейса Table<R>. Это недосмотр или преднамеренная мера против чего-то, что я упускаю?

Есть ли надежный и элегантный способ добиться того, чего я хочу, то есть не прибегая к рефлексии?

EDIT: две таблицы никогда не используются вместе в одном запросе. Конкретный шаблон использования следующий: в любой момент синоним БД CUSTOMER будет указывать на один (активный), в то время как другой модифицируется (теневая копия). Как только модификация завершена, роли меняются местами, указывая синоним на другой, и мы начинаем сначала. Мы делаем это, чтобы свести к минимуму "время простоя" больших таблиц результатов отчетов.


person blubb    schedule 04.05.2016    source источник
comment
Будут ли у вас CUSTOMER1 и CUSTOMER2 в одном запросе, или это взаимоисключающие клиенты, которые появляются только один раз в запросе?   -  person Lukas Eder    schedule 04.05.2016
comment
@ Лукас Эдер: спасибо, я обновил вопрос.   -  person blubb    schedule 04.05.2016


Ответы (1)


Ответ на ваш вопрос

Вопрос в заголовке:

почему нет Table.rename(String)?

Эта функция была реализована в jOOQ 3.3 (#2921). Проблема гласит:

Поскольку переименование таблиц на самом деле не является функцией SQL DSL, метод rename() следует генерировать только для сгенерированных таблиц, а не объявлять в org.jooq.Table.

На самом деле, этот аргумент не имеет особого смысла. Существуют и другие утилиты, не относящиеся к DSL, для типов DSL. Я не понимаю, почему rename() особенный. Метод должен быть объявлен на Table, как вы предложили. Это будет сделано в jOOQ 3.9 (#5242).

Ответ на вашу проблему

Из обновления вашего вопроса я понимаю, что вам действительно не нужен этот детальный контроль переименования. Подойдет стандартная функция мультиарендности jOOQ. В руководстве это называется "отображение таблицы":

http://www.jooq.org/doc/latest/manual/sql-building/dsl-context/runtime-schema-mapping

Для области Configuration (наиболее детальная область: уровень для каждого запроса) вы можете переписать любое подходящее имя таблицы как таковое:

Settings settings = new Settings()
    .withRenderMapping(new RenderMapping()
    .withSchemata(
        new MappedSchema().withInput("MY_SCHEMA")
                          .withOutput("MY_SCHEMA")
                          .withTables(
         new MappedTable().withInput("CUSTOMER")
                          .withOutput("CUSTOMER1"))));
person Lukas Eder    schedule 04.05.2016
comment
Спасибо Лукас. Зная, что Table.rename() появится в версии 3.9, я пока воспользуюсь хаком отражения, так как позже его будет легче мигрировать. - person blubb; 04.05.2016