java - jOOQ 字段<T> = DSL.any(DSL.val(T...))

标签 java postgresql jooq

这个问题是 ANY operator with jOOQ 的衍生问题和 Are arrays optimized in jOOQ & PostgreSQL? .

我有一个Field<T> fieldList<T> values我想表达SQL identifier = any({... the values ...}) 。我尝试这样做:

field.equal(DSL.any(DSL.val(values.stream().toArray())))

(请注意,这是通用实现的一部分,因此我目前没有实际类型。我只有 Field<T>List<T> 。)

但这不起作用,因为 API 接受 T...而不是Object...field.equal(DSL.any(...))需要T 。所以,我将其更改为:

field.equal(DSL.any(DSL.val((T[]) values.stream().toArray())))

但是,评论中说我不应该这样做。可能是一个愚蠢的问题和Java而不是jOOQ问题,但应该如何完成?

附带问题:简单地接受 List<T> 不是一个好主意吗?在 API 中?这也可能会提高性能,因为我们避免了手动创建数组。

注意:field.equal(DSL.any(values.stream().toArray())) 的情况相同。和field.equal(DSL.any(DSL.array(values.stream().toArray()))) .

最佳答案

每次您使用带有不安全强制转换的 jOOQ API 时,您都应该想:我使用它是否正确?

就您而言,错误在这里:

DSL.val((T[]) values.stream().toArray())

构造此数组的正确方法是(假设 TInteger ,此处):

DSL.val(values.stream().toArray(Integer[]::new))

或者,如果 valuesCollection ,那么更简单:

DSL.val(values.toArray(new Integer[0]))

将正确类型的数组传递给 jOOQ 非常重要,因为 jOOQ 将使用该数组的反射来确定它是什么数据类型,然后将其映射到例如PostgreSQL ?::int[]

Side question: isn't it a good idea to simply accept a List<T> in the API? This might also improve performance, since we are avoiding the manual array creation.

问题是Java删除了T的泛型类型信息,jOOQ 需要在各种边缘情况下正确转换绑定(bind)变量。所以,T[]是比 List<T> 更可取的类型在这种情况下。

关于java - jOOQ 字段<T> = DSL.any(DSL.val(T...)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45858042/

相关文章:

java - 为什么我得到这个 org.xml.sax.SAXParseException 异常?

java - @Formula 从 spring data jpa 中的 @OneToMany 关联中计数对象

java - Grails 和 Java : Proper way to unmarshall Json from Grails in Java app

java - 使用http读取xml文件

sql - PostgreSQL 如何将 null 视为值

java - 我可以使用 JOOQ 作为 SQL 解析器吗?

java - 使用 jOOQ 改变数据

java - Postgresql 中插入枚举的问题

mysql - MySQL/PostgreSQL 是否缓存查询的解析/编译?

java - 在没有代码生成的情况下使用jOOQ生成SQL时如何使用jOOQ转换器?