jpa中的sql对象聚合

izkcnapc  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(410)

我想问一下是否有可能在jpa中使用对象聚合函数(它使用hql)。功能如下 json_agg() 我想达到这样的目标。所以目标是获取实体并将其转换为字符串。

Expressions.stringTemplate("jsonb_agg(json_build_object('entity', {0}))", qEntity.id)

为什么我要这么做我明白了 org.hibernate.QueryException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode 错误。我´我读到的问题是我不能使用hql,因为我不能在json聚合函数中使用hql对象属性。
我想尽量避免使用QueryDSLSQL(这会使docker应用程序部署复杂化,需要连接到数据库等)。那么,有没有什么方法可以使用hql生成这样的对象呢?我使用的是springdatajpa,所以有机会使用这个工具来判断是否有更好的解决方案。

vltsax25

vltsax251#

querydsl代码段看起来不错,但需要为注册自定义函数 JSONB_AGG 以及 JSON_BUILD_OBJECT 以及jsonb结果的自定义类型。
对于自定义jsonb类型,可以使用 JsonBinaryTypehibernate-types 图书馆。
对于自定义函数,需要创建 MetadataBuilderInitializer 向hibernate注册sql函数。你可以从我的工作中得到灵感 hibernate-types-querydsl-apt 图书馆(例如 ArrayFunctionInitializer ). 具体应用到json函数,您将得到如下结果:

public class ArrayFunctionInitializer implements MetadataBuilderInitializer {

    @Override
    public void contribute(MetadataBuilder metadataBuilder, StandardServiceRegistry standardServiceRegistry) {
        metadataBuilder.applySqlFunction("json_build_object", new StandardSQLFunction("json_build_object", JsonBinaryType.INSTANCE));
        metadataBuilder.applySqlFunction("jsonb_agg", new StandardSQLFunction("jsonb_agg", JsonBinaryType.INSTANCE));
    }
}

相关问题