如何在查询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
相关产品推荐
相关产品推荐

