使用 jOOQ 的任意运算符

Bas*_*ers 2 java postgresql jooq

我无法理解以下内容。我有一个字段和一些值:

Field<T> field = ...;
List<T> values = ...;
Run Code Online (Sandbox Code Playgroud)

现在,我想field = ANY({... the values ....})WHERE子句中表达过滤器。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)));
Run Code Online (Sandbox Code Playgroud)

上面的方法不起作用。这编译:

field.equal((QuantifiedSelect) PostgresDSL.any(PostgresDSL.array(values)));
Run Code Online (Sandbox Code Playgroud)

第一个问题:为什么需要额外的演员阵容?API 是否应该更改?我不确定泛型错误实际上是在哪一边(我的还是 jOOQ 的)。

但是,进行此更改后,查询本身无法正常工作。它给出了错误:

org.jooq.exception.SQLDialectNotSupportedException: Type class java.util.ArrayList is not supported in dialect DEFAULT
Run Code Online (Sandbox Code Playgroud)

第二个问题:如何声明/创建值数组?上面的调用PostgresDSL.array(...)回落到DSL.array(...),这可能是第二个问题的根源?

Luk*_*der 5

使用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));
Run Code Online (Sandbox Code Playgroud)

你的错误是:

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