有jOOQ的任何运算符

时间:2017-08-23 08:56:42

标签: java postgresql jooq

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

Field<T> field = ...;
List<T> values = ...;

现在,我想在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)));

上述方法无效。这编译:

field.equal((QuantifiedSelect) PostgresDSL.any(PostgresDSL.array(values)));

第一个问题:为什么需要额外演员? API应该改变吗?我不确定在哪一方(我和jOOQ&#39; s)实际上是泛型错误。

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

org.jooq.exception.SQLDialectNotSupportedException: Type class java.util.ArrayList is not supported in dialect DEFAULT

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

1 个答案:

答案 0 :(得分:2)

使用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(<SELECT expression>)语法,当您想要将相关子查询的结果收集到数组中时,此语法非常有用。在您的情况下,您不需要这样做,因为如果这是您想要的,那么您可以使用Field.in(Select)。请注意,没有DSL.array(...)
  2. 您引用了来自PostgresDSL的{​​{3}}运算符,DSLspinner.setAdapter(yourAdapter); spinner.setSelected(position); //position is integer starting from 0 to n-1 (n is number of items in the list or array). This will set nth item as the selected and visible item to the user. 的子类。这是有效的,因为Java允许它,但可能导致这里的混乱。