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

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

我需要能够使用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转换为Condition:

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

但这次演员失败了。

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

java sql jooq
1个回答
2
投票

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

Write "plain SQL" conditions

您似乎使用jOOQ更多类型安全的API,甚至代码生成器,因此构建您的filterList的适当方法是:

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

假设存在以下静态导入:

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

Create actual field references

您已经使用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));

Using the code generator

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

Why your cast didn't work

你显然不能把qazxsw poi施放到qazxsw poi。这些类型是完全不相关的,Java编译器无法“猜测”您真正的意思是上述类型转换之一。

© www.soinside.com 2019 - 2024. All rights reserved.