Как создать динамическое предложение SELECT с помощью jOOQ

Я хочу создать запрос выбора с помощью JOOQ. У меня есть несколько полей, которые я хочу включить или исключить из запроса на основе значения системного свойства.

В приведенном ниже методе

String getBankDetails(){
return select(field("Name"),
        field("Bank_Account_Name"),
        field("Bank_Account_Number")
        .from(table("BANK"))
        .getSQL(ParamType.INLINED); 
}

Я хочу добавить еще одно поле динамически, как показано ниже.

field("Bank_Account_Branch") if System.getProperty("enableBranch") == true

Просто назначьте построитель переменной, а затем используйте if?

dan1st 22.04.2024 06:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте необязательное выражение столбца или просто проецируйте null:

select(
    BANK.NAME,
    BANK.BANK_ACCOUNT_NAME,
    BANK.BANK_ACCOUNT_NUMBER,
    "true".equals(System.getProperty("enableBranch"))
        ? BANK.BANK_ACCOUNT_BRANCH
        : noField(BANK.BANK_ACCOUNT_BRANCH))
.from(BANK)
.fetch();

Альтернативно, просто спроецируйте null:

    "true".equals(System.getProperty("enableBranch"))
        ? BANK.BANK_ACCOUNT_BRANCH
        : cast(inline(null), BANK.BANK_ACCOUNT_BRANCH))

Обратите внимание: этот ответ предполагает вы собираетесь использовать генератор кода. Если ваша схема не является действительно динамической (и, следовательно, неизвестна во время компиляции), вы только выиграете от использования генерации кода и сможете обойти массу проблем. Например, в своем вопросе вы не прикрепили типы данных к своей проекции, поэтому вы будете зависеть от того, что JDBC вернет вам. Но ответ работает и для динамических схем:

select(
    field("Name", VARCHAR),
    field("Bank_Account_Name", VARCHAR),
    field("Bank_Account_Number", VARCHAR),
    "true".equals(System.getProperty("enableBranch"))
        ? field("Bank_Account_Branch", VARCHAR)
        : noField(VARCHAR))
.from("BANK")
.fetch();

Спасибо!! noField() хорошо подходит для моего случая. У меня была версия jooq v3.16, поэтому я обновил ее до версии 3.19, поскольку в версии 3.17 был добавлен DSL.noField(). подробнее github.com/jOOQ/jOOQ/issues/2333

riteshmaurya 24.04.2024 01:57

Другие вопросы по теме