我想问一下是否有可能在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,所以有机会使用这个工具来判断是否有更好的解决方案。
1条答案
按热度按时间vltsax251#
querydsl代码段看起来不错,但需要为注册自定义函数
JSONB_AGG
以及JSON_BUILD_OBJECT
以及jsonb结果的自定义类型。对于自定义jsonb类型,可以使用
JsonBinaryType
从hibernate-types
图书馆。对于自定义函数,需要创建
MetadataBuilderInitializer
向hibernate注册sql函数。你可以从我的工作中得到灵感hibernate-types-querydsl-apt
图书馆(例如ArrayFunctionInitializer
). 具体应用到json函数,您将得到如下结果: