gpt4 book ai didi

java - 使用 jOOQ 的任意运算符

转载 作者:行者123 更新时间:2023-11-29 12:54:53 25 4
gpt4 key购买 nike

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

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

现在,我想在 WHERE 子句中表达过滤器 field = ANY({... the values ....}) 。 PostgreSQL 支持此ANY(值数组) 运算符。我从 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)));

第一个问题:为什么需要额外的 Actor 阵容? API 是否应该更改?我不确定泛型错误实际上是在哪一边(我的还是 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(<SELECT expression>)语法,当您想要将相关子查询的结果收集到数组中时,该语法非常有用。在您的情况下,您不需要它,因为如果这就是您想要的,在这里,您可以简单地使用 Field.in(Select) 。注意,没有DSL.array(...)
  2. 您引用了 DSL.any(T[]) 来自 PostgresDSL 的运算符,它是 DSL 的子类。这是可行的,因为 Java 允许这样做,但可能会造成这里的困惑。

关于java - 使用 jOOQ 的任意运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45835065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com