如何使用 jOOQ 创建动态 SELECT 子句

问题描述 投票:0回答:1

我想使用 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
java sql jooq
1个回答
0
投票

使用可选列表达式或仅投影

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();
© www.soinside.com 2019 - 2024. All rights reserved.