gpt4 book ai didi

java - 在 jooq 中访问 sql-array 项目

转载 作者:搜寻专家 更新时间:2023-11-01 02:59:35 25 4
gpt4 key购买 nike

如何像在这个 sql 查询中一样访问 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 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39390199/

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