【问题标题】:ANY operator with jOOQ任何带有 jOOQ 的运算符
【发布时间】:2017-08-24 14:53:38
【问题描述】:

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

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

现在,我想在WHERE 子句中表达过滤器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?我不确定泛型错误实际上在哪一侧(我的与 jOOQ 的)。

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

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

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

【问题讨论】:

    标签: java postgresql jooq


    【解决方案1】:

    使用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(&lt;SELECT expression&gt;) 语法,当您想将相关子查询的结果收集到数组中时,这很有用。在你的情况下你不需要那个,因为如果这是你想要的,在这里,你可以简单地使用Field.in(Select)。注意,没有DSL.array(...)
    2. 您从PostgresDSL 引用了DSL.any(T[]) 运算符,它是DSL 的子类。这是可行的,因为 Java 允许这样做,但可能导致了这里的混乱。

    【讨论】:

    • 我试过了,我遇到了另一个我昨天也遇到的问题。现在,我有:field.equal(DSL.any((T[]) values.stream().toArray()))。生成以下 SQL id = any (?::any[])。但是,该参数永远不会绑定,我们最终会遇到 SQL 语法异常。这就是为什么我尝试按照我原来的问题中所述做DSL.any(DSL.array(...)) 的原因。
    • 我试过了,我遇到了另一个我昨天也遇到的问题。现在,我有:field.equal(DSL.any((T[]) values.stream().toArray()))。生成以下 SQL id = any (?::any[])。但是,该参数永远不会绑定,我们最终会遇到 SQL 语法异常。这就是我尝试做DSL.any(DSL.array(...)) 的原因,如我原来的问题中所述。但如前所述,我做错了。我会再试一次。
    • 我得到了它与DSL.any(DSL.array((T[]) values.stream().toArray()))的合作!伟大的成功:)。唯一困扰我的是手动转换为数组,而不是仅仅传递List&lt;T&gt;
    • 你有很多问题值得在一个新问题中提出,我认为...... :) 特别是,你不应该投给(T[])......
    • 我知道我不应该,但是API不接受Object[]...而是T[]...,所以它需要那个类型。然后我会提出一些问题,因为还有另一件事让我感到困惑:)。
    猜你喜欢
    • 2016-11-15
    • 1970-01-01
    • 2021-09-09
    • 2022-09-30
    • 1970-01-01
    • 2020-03-07
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多