You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在查询Postgres数组的单个原生查询中使用Hibernate Types库类型

方案1:补全标量映射解决返回结果不全问题

你之前使用addScalar仅返回单个UUID并非Hibernate Types的bug,原生查询一旦显式指定任意addScalar规则,Hibernate就只会返回你声明的字段,补全所有需要返回的字段即可正常拿到全部结果,该配置仅作用于当前查询:

List<Object[]> results = query.unwrap(org.hibernate.query.NativeQuery.class)
        // 补全所有查询返回字段的标量映射
        .addScalar("id", StandardBasicTypes.UUID)
        .addScalar("date", StandardBasicTypes.LOCAL_DATE_TIME)
        .addScalar("condition_set_ids", UUIDArrayType.INSTANCE)
        .getResultList();

// 遍历结果组装为对应实体/DTO即可
for (Object[] row : results) {
    UUID id = (UUID) row[0];
    LocalDateTime date = (LocalDateTime) row[1];
    UUID[] conditionSetIds = (UUID[]) row[2];
    // 后续业务逻辑
}
方案2:手动转换JDBC原生数组(零额外配置)

如果不想调整查询的标量声明,可以直接接收JDBC原生的java.sql.Array对象,自行转换为UUID数组,完全不需要注册任何全局类型,也不会影响其他查询逻辑:

// 用Tuple接收查询结果,方便按字段名取值
Query query = entityManager.createNativeQuery(queryString, Tuple.class);
List<Tuple> results = query.getResultList();

for (Tuple row : results) {
    UUID id = row.get("id", UUID.class);
    LocalDateTime date = row.get("date", LocalDateTime.class);
    Array jdbcArray = row.get("condition_set_ids", Array.class);
    UUID[] conditionSetIds = null;
    if (jdbcArray != null) {
        try {
            conditionSetIds = (UUID[]) jdbcArray.getArray();
        } catch (SQLException e) {
            // 按需处理异常即可
            conditionSetIds = new UUID[0];
        }
    }
    // 后续业务逻辑
}

内容的提问来源于stack exchange,提问作者Sebastiaan van den Broek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:54:05