代码之家  ›  专栏  ›  技术社区  ›  Bas Opers

jOOQ字段=DSL。任何(DSL.val(T…)

  •  0
  • Bas Opers  · 技术社区  · 7 年前

    这个问题是从 ANY operator with jOOQ Are arrays optimized in jOOQ & PostgreSQL?

    我有一个 Field<T> field List<T> values 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())))
    

    附带问题:简单地接受 列表(<);T> 在API中?这还可能提高性能,因为我们避免了手动创建阵列。

    注:同样的情况适用于 field.equal(DSL.any(values.stream().toArray())) field.equal(DSL.any(DSL.array(values.stream().toArray()))) .

    1 回复  |  直到 7 年前
        1
  •  1
  •   Lukas Eder    7 年前

    在您的情况下,错误在于:

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

    T Integer ,此处):

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

    values Collection ,然后更简单地说:

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

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

    List<T> 在API中?这还可能提高性能,因为我们避免了手动创建阵列。

    ,jOOQ需要在各种边缘情况下正确转换绑定变量。所以 T[] 是一种比 列表(<);T>