【问题标题】:How to use a 'Hibernate Types' library type in a single native query that selects Postgres arrays?如何在选择 Postgres 数组的单个本机查询中使用“休眠类型”库类型?
【发布时间】: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


    【解决方案1】:

    您可以使用自定义 Hibernate 类型调用本机查询,如下所示:

    String myJsonbData = ...;
    String[] myStringArr = ...;
    final String queryStr = "select your_function(?, ?, ...)"; // ? for each param
    entityManager
        .createNativeQuery(queryStr)
        .setParameter(1, new TypedParameterValue(JsonBinaryType.INSTANCE, myJsonbData))
        .setParameter(2, new TypedParameterValue(StringArrayType.INSTANCE, myStringArr));
    

    这只是一个示例,但根据经验,您需要实例化 new TypedParameterValue

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多