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(...),这可能是第二个问题的根源?
使用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)
你的错误是:
PostgresDSL.array(Select)对应于 PostgreSQL 的ARRAY(<SELECT expression>)语法,当您想要将相关子查询的结果收集到数组中时,这非常有用。在您的情况下,您不需要它,因为如果这就是您想要的,在这里,您可以简单地使用Field.in(Select). 注意,没有DSL.array(...)DSL.any(T[])来自 的运算符PostgresDSL,它是 的子类DSL。这是可行的,因为 Java 允许这样做,但可能会造成这里的混乱。| 归档时间: |
|
| 查看次数: |
3092 次 |
| 最近记录: |