JOOQ-如何将array_agg与自定义类型字段一起使用

时间:2019-05-23 09:07:43

标签: jooq

我正在使用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的限制吗?

谢谢!  丹

1 个答案:

答案 0 :(得分:0)

我最终得到以下解决方法:

dslContext.select(TABLE.FIELD1, arrayAgg(TABLE.FIELD2).coerce(Long[].class))
            .from(TABLE)
            .groupBy(TABLE.FIELD1)
            .fetch();

然后在提取后将Long转换为我的自定义类型。