我正在使用Jooq(与PostgreSQL)。我需要在某些查询上使用array_agg
,以从自定义类型的字段中聚合值。
SELECT TABLE.FIELD1, array_agg(TABLE.FIELD2) FROM TABLE GROUP BY TABLE.FIELD1;
dslContext.select(TABLE.FIELD1, arrayAgg(TABLE.FIELD2))
.from(TABLE)
.groupBy(TABLE.FIELD1)
.fetch();
FIELD2是数据库中的int8
列,通常映射到Java Long。
我已经定义了TypeConverter
强制转换为某些Java类。
转换在所有查询中均能正常工作,但在使用array_agg
时会失败,并出现以下异常:
Caused by: java.sql.SQLException: Error while reading field: array_agg("PUBLIC"."TABLE"."FIELD2"), at JDBC index: 2
at org.jooq.impl.CursorImpl$CursorIterator$CursorRecordInitialiser.setValue(CursorImpl.java:1781)
at org.jooq.impl.CursorImpl$CursorIterator$CursorRecordInitialiser.operate(CursorImpl.java:1740)
at org.jooq.impl.CursorImpl$CursorIterator$CursorRecordInitialiser.operate(CursorImpl.java:1705)
at org.jooq.impl.RecordDelegate.operate(RecordDelegate.java:125)
at org.jooq.impl.CursorImpl$CursorIterator.fetchNext(CursorImpl.java:1669)
... 120 more
Caused by: org.jooq.exception.DataTypeException: Cannot convert from 15 (class java.lang.Long) to class <my custom class>
at org.jooq.tools.Convert$ConvertAll.fail(Convert.java:1167)
at org.jooq.tools.Convert$ConvertAll.from(Convert.java:1056)
at org.jooq.tools.Convert.convert0(Convert.java:322)
at org.jooq.tools.Convert.convert(Convert.java:314)
at org.jooq.tools.Convert.convert(Convert.java:386)
at org.jooq.tools.Convert.convertArray(Convert.java:293)
at org.jooq.tools.Convert$ConvertAll.from(Convert.java:537)
at org.jooq.tools.Convert.convert0(Convert.java:322)
at org.jooq.tools.Convert.convert(Convert.java:314)
at org.jooq.tools.Convert.convert(Convert.java:386)
at org.jooq.impl.DefaultBinding$DefaultArrayBinding.convertArray(DefaultBinding.java:1128)
at org.jooq.impl.DefaultBinding$DefaultArrayBinding.pgGetArray(DefaultBinding.java:1117)
at org.jooq.impl.DefaultBinding$DefaultArrayBinding.get0(DefaultBinding.java:1033)
at org.jooq.impl.DefaultBinding$DefaultArrayBinding.get0(DefaultBinding.java:912)
at org.jooq.impl.DefaultBinding$AbstractBinding.get(DefaultBinding.java:775)
at org.jooq.impl.CursorImpl$CursorIterator$CursorRecordInitialiser.setValue(CursorImpl.java:1771)
有任何解决方法吗?这是JOOQ的限制吗?
谢谢! 丹
答案 0 :(得分:0)
我最终得到以下解决方法:
dslContext.select(TABLE.FIELD1, arrayAgg(TABLE.FIELD2).coerce(Long[].class))
.from(TABLE)
.groupBy(TABLE.FIELD1)
.fetch();
然后在提取后将Long转换为我的自定义类型。