【问题标题】:Include clause in jooq prepared statement conditionally有条件地在 jooq 准备语句中包含子句
【发布时间】:2018-05-10 11:02:00
【问题描述】:

您好,我正在使用 JOOQ 在我的 java 应用程序中构建 SQL 语句。我需要在特定条件下在我的语句中包含一个 or 子句,而在另一个条件下省略。 例如

org.jooq.Query ps =  select(field("q.*"))
                            .from(table("QUEUES q"))
                            .where(field("q.APPLICATION").eq("APP1"));

然后我需要根据其他一些变量取消查询的一个或部分..

org.jooq.Query ps =  select(field("q.*"))
                            .from(table("QUEUES q"))
                            .where(field("q.APPLICATION").eq("APP1"))
                            .or(field("q.APPLICATION").eq("APP2"));

如果没有两个单独的语句,我无法弄清楚如何做到这一点,一个包括 or 语句,一个没有。提前致谢。

【问题讨论】:

  • 注意,您可以为自己的问题提供自己的答案,而不是编辑问题本身。问题的未来访问者会更容易理解
  • 作为记录,手册中关于使用jOOQ进行动态SQL的相关部分在这里:jooq.org/doc/latest/manual/sql-building/dynamic-sql

标签: java sql jooq


【解决方案1】:

您想要做的是使用SelectConditionStep 的扩展名,这将允许您将查询分解为单独的步骤,并使用标志作为仅将SelectConditionStep 的一个特定扩展名附加到查询的方法。

给定您的查询和一个标志(boolean - 用于分隔 SelectConditionStep 的扩展名)要求例如checkBothApps.

boolean checkBothApps = false;

org.jooq.SelectJoinStep<R> joinStep =  select(field("q.*"))
                        .from(table("QUEUES q"));

org.jooq.SelectConditionStep<R> conditionStep = joinStep.where(field("q.APPLICATION").eq("APP1"));

if (checkBothApps) {
  // This condition will be added to the join step.
  joinStep.or(field("q.APPLICATION").eq("APP2"));
}

编辑:测试代码。

【讨论】:

  • 虽然这工作得很好,但通常最好将整个 Condition 存储在局部变量中,而不是 XYZ..Step 类型。
  • 感谢 Lukas 的提示。是否可以进一步解释其中的原因,以便更好地理解!编辑:我是否可以假设您指的是类似于下面的 OP 答案的内容?
  • 是的,this answer 表明了我的意思。这种方法的优点是 1) 它在不可变的 API 元素上运行,2) 它对于更复杂的动态 SQL 构造更具可组合性和可用性,3) 它更具可读性。 4)在某些时候,你的方法是不够的,你将不得不恢复到另一个。理想情况下,您永远不需要从客户端代码中显式引用任何带有 Step 后缀的 API。我想这将是 Javadocs 中增加可见性的一个很好的评论:github.com/jOOQ/jOOQ/issues/7478
【解决方案2】:

感谢 Koshux 我是这样做的...

Condition whereClause = field("q.APPLICATION").eq("APP1");
if(bothApps){
    whereClause = whereClause.or(field("q.APPLICATION").eq("APP2"));
}
org.jooq.Query ps =  select(field("q.*"))
                     .from(table("QUEUES q"))
                     .where(whereClause);

【讨论】:

    猜你喜欢
    • 2013-12-31
    • 2021-11-05
    • 2021-04-25
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    相关资源
    最近更新 更多