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

时间:2018-01-21 15:52:41

标签: java sql jooq

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

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转换为Condition:

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

但这次演员失败了。

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

1 个答案:

答案 0 :(得分:2)

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));

使用代码生成器

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

为什么你的演员没有工作

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