当前位置: 首页 > 知识库问答 >
问题:

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

公孙和怡
2023-03-14

我正在使用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是DB中的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个答案

欧阳俊捷
2023-03-14

我最终得出了以下解决方案:

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

以及在抓取后将Long转换为我的自定义类型。

 类似资料:
  • 问题内容: 我知道Android 很棒。它使我们能够播放本地文件以及媒体流。而且非常容易使用(例如): 通过调用具有不同参数集的重载,可以设置不同类型的DataSource 。这个函数有一个有趣的原型: 看起来可以用自己的实现完全覆盖。它确实有效: 并在主要代码中: 是的,这很好。但是,如果我尝试音频/ aacp广播流(例如:“ http://111.223.51.8:8005”-它是“ COOL

  • 问题内容: 我还没有找到一种方法来做到这一点。可能吗? 问题答案: 好吧,我无法弄清楚如何使用可用的类,因此我自己扩展了它,现在它对我有用。这是我所做的:

  • 问题内容: 我只是开始看一下Mattt出色的新Alamofire快速联网库,并且不确定如何将其与自定义标头一起使用。 我正在尝试从AFNetworking转换为Alamofire的代码是这样的: 问题答案: 根据官方文档,不建议修改会话配置: 不建议将其用于Authorization或Content- Type标头。而是分别使用URLRequestConvertible和ParameterEnco

  • 我正在将我的Spring应用程序从Spring-boot 1.5.9迁移到Spring-boot 2.0.0。使用这个新的Spring包,我在Redis中缓存数据时遇到了一些问题。 在我的配置中,我有3个具有不同TTL(长、中、短)的CacheManager: 我还有一个自定义RestTemplate: 在上一个Spring版本中,缓存的每个数据都使用这个RestTemplate,并使用Gener

  • 我创建了一个简单的类型: 现在我想初始化一个已经声明的变量(当前值=0),其结果为 现在,TypeScript告诉我,类型号不能赋给CustomType类型,即使初始化应该工作,只要数字是0、1、2、3、4或5的整数。: TS2322:类型“number”不能赋给类型“CustomType”。 不幸的是,到目前为止,我没有找到任何解决方案。转换为标准类型很好,但我不确定如何使我的自定义类型接受一个

  • 问题内容: 这是课程: 现在,我试图从类中“反射”此方法: 问题答案: 只有一个。 另一种选择是。 其他原语也是如此。