【发布时间】:2022-06-11 17:41:38
【问题描述】:
我有一个返回 UUID 的 Postgres 数组的查询:
SELECT e.id, e.date,
ARRAY
(
SELECT cs.api_id FROM event_condition_set ecs
JOIN condition_set cs on cs.id = ecs.condition_set_id
WHERE ecs.event_id = e.id
) AS condition_set_ids,
...
然后创建并运行此查询作为本机查询:Query query = entityManager.createNativeQuery(queryString);
由于 Hibernate 通常不能处理这些 Postgres 数组,所以我使用 Vlad 的 Hibernate Types 库。
但是,目前我需要在我的应用程序中全局注册这个 UUIDArrayType:
public class PostgreSQL95CustomDialect extends PostgreSQL95Dialect {
public PostgreSQL95CustomDialect() {
super();
this.registerHibernateType(Types.ARRAY, UUIDArrayType.class.getName());
}
}
除了有点难看之外,它也没有为其他类型的数组留下空间。
(注意我也尝试注册一个通用的ListArrayType,但这会在查询执行期间引发 NullPointerException。)
我也尝试将其注册为标量类型:
query.unwrap(org.hibernate.query.NativeQuery.class)
.addScalar("condition_set_ids", UUIDArrayType.INSTANCE);
但这使得整个查询只返回一个 UUID,这很奇怪,似乎有 bug。
有没有办法只在这个查询中使用这个UUIDArrayType?
(请不要建议使用array_agg,因为这种情况下性能很糟糕)
【问题讨论】:
标签: java postgresql spring-boot hibernate hibernate-types