java - 如何使用 JOOQ 正确构建动态 WHERE 子句条件?

标签 java sql jooq

我需要能够使用 String 元素列表动态构建 JOOQ“WHERE”关闭,其中每个元素代表一个文件管理器:

List<String> filerList = new ArrayList<>();
    filerList.add("column1=Y");
    filerList.add("column2=Z");

期望的最终结果应该如下所示:

  String sql =
    DSL.select(flds)
            .from(table(tableName))
            .where(conditions)
            .getSQL();

我希望能够将我的filterList转换为条件:

    Collection<Condition> conditions = new ArrayList<Condition>();
    conditions.add((Condition) filerList);

但是这次转换失败了。

将此类过滤器列表转换为 JOOQ 的 WHERE 子句的条件的正确语法是什么?

最佳答案

jOOQ中有很多方法可以写出dynamic SQL的那种你正在尝试写的。在您的特定情况下, where(Collection<? extends Condition>) 方法是最合适的。同样,您有多种选择:

"plain SQL"条件

您似乎可以使用 jOOQ 类型更安全的 API,甚至代码生成器来解决问题,因此构建您的 filterList 的适当方法是这样的:

List<Condition> filterList = new ArrayList<>();
filterList.add(condition("column1=Y"));
filterList.add(condition("column2=Z"));

假设存在以下静态导入:

 import static org.jooq.impl.DSL.*;

创建实际字段引用

您已使用 DSL.table(String) 创建了表引用,那么为什么不使用 DSL.field(String, Class) 创建列引用呢?例如?

List<Condition> filterList = new ArrayList<>();
filterList.add(field("column1", String.class).eq(y));
filterList.add(field("column2", Integer.class).eq(z));

使用代码生成器

当然,如果您使用代码生成器,这会更加强大和简单。

为什么你的 Actor 阵容不起作用

你显然不能转换 List<String>Condition 。这些类型完全不相关,Java 编译器无法“猜测”您真正的意思是上述类型转换之一。

关于java - 如何使用 JOOQ 正确构建动态 WHERE 子句条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48368652/

相关文章:

java - 通过 curl 使用 JSTL formatNumber 的浮点舍入错误

java - 错误 : Selection does not contain a main type

java - 我可以使用 JOOQ 作为 SQL 解析器吗?

java - Spring 3的最小Hibernate 4 XML配置,用于基于注释的事务管理和对象映射?

java - 使用 java 的以下场景的最佳解决方案?

java - 如何解决SQL中锁等待超时异常?

SQL Server 2000 与 SQL Server 2008 查询性能

mysql - 如何获得当天的随机行?

java - JOOQ使用Record7封装不同表的字段

spring - 选择顺序在窗口和容器中的工作方式不同