java – 在jooq中访问sql-array项

如何在这个sql-query中访问JOOQ中的数组项?SELECT (ARRAY_AGG(id))[1]FROM entities;像这样的东西:dsl().select(arrayAgg(ENTITIES.ID).get(1)).from(ENTITIES).fetch();或者只访问第一项:dsl().select(arrayAgg...

如何在这个sql-query中访问JOOQ中的数组项?

SELECT (ARRAY_AGG(id))[1]
FROM entities;

像这样的东西:

dsl().select(arrayAgg(ENTITIES.ID).get(1)).from(ENTITIES).fetch();

或者只访问第一项:

dsl().select(arrayAgg(ENTITIES.ID).head()).from(ENTITIES).fetch();

我知道字符串解决方案,但它并不好:

field("(ARRAY_AGG(id))[1]")

解决方法:

从jOOQ 3.8开始,这不是开箱即用的.有一个对数组元素访问的待处理功能请求:
https://github.com/jOOQ/jOOQ/issues/229

为什么Java无法提供此功能

其中一个问题是API设计.您建议的后修复方法无法返回适当的类型.考虑这个API设计:

interface Field<T> {
    Field<???> get(int index); // What type to return here?
}

在Java中,不可能对类的泛型类型参数< T>进行任何其他约束.在每个方法级别上,如在下面的假设代码中使用类似“部分方法”的东西(即仅在Field< T>的某些子类型上可用的方法,即T是数组的那些方法):

interface Field<T> {
    @If(T instanceof E[])
    Field<E> get(int index);
}

解决方法

但是你可以编写自己的解决方法.例如:

@SuppressWarnings("unchecked")
public static <T> Field<T> elementAt(Field<T[]> arrayField, int index) {
    return DSL.field("{0}[{1}]", 
        (Class<T>) arrayField.getType().getComponentType(),
        arrayField, DSL.inline(index)
    );
}

你现在可以这样使用它:

dsl().select(elementAt(arrayAgg(ENTITIES.ID), 1))
     .from(ENTITIES)
     .fetch();

本文标题为:java – 在jooq中访问sql-array项

基础教程推荐