jooq:如何为静态DSL方法配置方言?

时间:2016-05-27 13:59:50

标签: java postgresql configuration jooq

我有dsl方言POSTGRES_9_4。我尝试使用org.jooq.impl.DSL.Condition自定义选择查询:

dsl.selectFrom(TAG_JSON).where(condition("translations ??| array[?]", normValues)).fetch(mapper);

它抛出异常:

org.jooq.exception.SQLDialectNotSupportedException: Type class java.util.ArrayList is not supported in dialect DEFAULT
    at org.jooq.impl.DefaultDataType.getDataType(DefaultDataType.java:757)
    at org.jooq.impl.DefaultDataType.getDataType(DefaultDataType.java:704)
    at org.jooq.impl.DSL.getDataType(DSL.java:14371)
    at org.jooq.impl.Utils.queryParts(Utils.java:1565)
    at org.jooq.impl.SQLImpl.<init>(SQLImpl.java:64)
    at org.jooq.impl.DSL.sql(DSL.java:6240)
    at org.jooq.impl.DSL.condition(DSL.java:7323)

为什么使用DEFAULT方言?如何配置全局的?

1 个答案:

答案 0 :(得分:1)

错误消息有点误导。您的意图似乎是array[?]List<String>作为单个绑定值传递给数组构造函数。这不行。您有两种选择:

绑定单个数组

condition("translations <op> ?::text[]", normValues.toArray(new String[0]))

将数组绑定为绑定值列表

condition("translations <op> {0}", list(
    normValues.stream().map(DSL::val).toArray(QueryPart[]::new)
))

这是使用DSL.list()创建绑定变量列表。

注意,在这两种情况下,我都避免使用??|运算符,因为jOOQ解析纯SQL文本以获取绑定值(?),并且当前不会将??|识别为非绑定变量序列(I've registered an issue for this)。如果该运算符具有文本替代表示,我建议使用该表示。