如何在这个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 BigDecimal类案例详解 2023-05-08
- Java聊天室之使用Socket实现传递对象 2023-06-23
- Spring Boot:Idea从零开始初始化后台项目的教程 2023-08-07
- Java类加载器ClassLoader源码层面分析讲解 2023-06-02
- SpringBoot图文并茂讲解登录拦截器 2023-02-04
- Java 事务注解@Transactional回滚(try catch、嵌套)问题 2023-04-06
- Java数据结构之链表的增删查改详解 2023-05-08
- 微信支付 开发账号体系各参数详解 2023-08-02
- 最新Java 泛型中的通配符讲解 2023-01-29
- MyBatis-Plus多表联查(动态查询)的项目实践 2023-04-07