Я хочу создать запрос выбора с помощью 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
Используйте необязательное выражение столбца или просто проецируйте 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
Просто назначьте построитель переменной, а затем используйте
if
?