如何在这个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项


基础教程推荐
- Java实现简单邮件发送功能 2023-01-24
- Java中replace与replaceAll的区别与测试 2023-06-01
- Java实现warcraft java版游戏的示例代码 2023-05-31
- SpringBoot2.6.x升级后循环依赖及Swagger无法使用问题 2023-01-18
- Java中JDBC的使用教程详解 2023-01-24
- 关于@Bean的使用方式 2022-09-03
- Java使用GZIP压缩导致HTTP请求返回乱码问题解决 2023-01-13
- Java之面向对象的思想、类与对象及其应用、对象的内存图、成员变量和局部变量的区别、匿名对象、封装(private)、this关键字 2023-09-01
- Java结构型设计模式中建造者模式示例详解 2023-05-24
- SpringBoot集成Druid的实例代码 2023-08-07