任何有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)); 

你的错误是:

  1. PostgresDSL.array(Select)对应于PostgreSQL的ARRAY(语法,当您想要将相关子查询的结果收集到数组中时,这种语法非常有用。 在你的情况下你不需要它,因为如果这是你想要的,在这里,你可以简单地使用Field.in(Select) 。 注意,没有DSL.array(...)
  2. 您从PostgresDSL引用了DSL.any(T[])运算符, PostgresDSLDSL的子类。 这是有效的,因为Java允许它,但可能会导致混乱。