任何有jOOQ的运算符
我很难理解以下内容。 我有一个字段和一些值:
Field field = ...; List values = ...;
现在,我想在WHERE
子句中表示filter field = ANY({... the values ....})
。 PostgreSQL支持这个ANY(array of values)
运算符。 我从https://blog.jooq.org/2017/03/30/sql-in-predicate-with-in-list-or-with-array-which-is-faster/得到了这个想法。
我尝试了以下创建条件:
field.equal(PostgresDSL.any(PostgresDSL.array(values)));
以上不起作用。 这编译:
field.equal((QuantifiedSelect) PostgresDSL.any(PostgresDSL.array(values)));
第一个问题 :为什么需要额外演员? API应该改变吗? 我不确定generics错误实际上是在哪一方(我和jOOQ)。
但是,在此更改之后,查询本身无法正常工作。 它给出了错误:
org.jooq.exception.SQLDialectNotSupportedException: Type class java.util.ArrayList is not supported in dialect DEFAULT
第二个问题 :如何声明/创建值数组? 上面的调用PostgresDSL.array(...)
正在回到DSL.array(...)
,这可能是第二个问题的根源?
使用DSL.any(T[])
:
// Using varargs field.equal(DSL.any(1, 2, 3)); // Using an actual array Integer array = { 1, 2, 3 }; field.equal(DSL.any(array));
你的错误是:
-
PostgresDSL.array(Select)
对应于PostgreSQL的ARRAY(
语法,当您想要将相关子查询的结果收集到数组中时,这种语法非常有用。 在你的情况下你不需要它,因为如果这是你想要的,在这里,你可以简单地使用Field.in(Select)
。 注意,没有DSL.array(...)
- 您从
PostgresDSL
引用了DSL.any(T[])
运算符,PostgresDSL
是DSL
的子类。 这是有效的,因为Java允许它,但可能会导致混乱。