Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 聚合函数中的JPA 2.0 Criteria Builder嵌套函数提供QuerySyntaxException_Hibernate_Jpa_Spring Data Jpa_Criteria_Hibernate Criteria - Fatal编程技术网

Hibernate 聚合函数中的JPA 2.0 Criteria Builder嵌套函数提供QuerySyntaxException

Hibernate 聚合函数中的JPA 2.0 Criteria Builder嵌套函数提供QuerySyntaxException,hibernate,jpa,spring-data-jpa,criteria,hibernate-criteria,Hibernate,Jpa,Spring Data Jpa,Criteria,Hibernate Criteria,我有一个Postgres数据库项目,它使用JSONB列存储一些任意数据,我已经注册了JSONB_extract_path_text函数。 我希望实现的是编写一个JPA条件查询,该查询将统计某些特定JSON键的出现次数,它的SQL等价物是: test=# select * from domain test-# ; id | extra -----+---------------- 1 | {"test1": "a"} 51 | {"test1": "b"} 10

我有一个Postgres数据库项目,它使用JSONB列存储一些任意数据,我已经注册了JSONB_extract_path_text函数。 我希望实现的是编写一个JPA条件查询,该查询将统计某些特定JSON键的出现次数,它的SQL等价物是:

test=# select * from domain
test-# ;
 id  |     extra      
-----+----------------
   1 | {"test1": "a"}
  51 | {"test1": "b"}
 101 | {"test2": "b"}
 151 | {"test2": "e"}
 201 | {"test2": "f"}
(5 rows)

test=# select count(jsonb_extract_path_text(extra, 'test1')) from domain;
 count 
-------
     2
(1 row)

现在使用以下条件查询

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery();
From from = cq.from(Domain.class);
cq.select(cb.count(cb.function("jsonb_extract_path_text", String.class, from.get("extra"), cb.literal("test1"))));
TypedQuery query = em.createQuery(cq);
List list = query.getResultList();
我得到以下例外

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: expecting CLOSE, found '(' near line 1, column 22 [select count(function('jsonb_extract_path_text', generatedAlias0.extra, 'test1')) from com.example.demo.Domain as generatedAlias0]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.hql.internal.ast.ErrorTracker.throwQueryException(ErrorTracker.java:93) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:297) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:189) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:113) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:73) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:155) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:604) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:716) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
    ... 43 common frames omitted
由以下原因引起:org.hibernate.hql.internal.ast.QuerySyntaxException:预期关闭,找到“(”第1行第22列附近的“[从com.example.demo.Domain中选择计数(函数('jsonb_extract_path_text',generatedAlias0.extra',test1'))作为generatedAlias0]
在org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74)~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
在org.hibernate.hql.internal.ast.ErrorTracker.throwQueryException(ErrorTracker.java:93)~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
在org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:297)~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
在org.hibernate.hql.internal.ast.QueryTranslatorImpl.docomfile(QueryTranslatorImpl.java:189)~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
在org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144)~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
在org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:113)~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
在org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:73)~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
在org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:155)~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
在org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:604)~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
在org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:716)~[hibernate-core-5.4.12.Final.jar:5.4.12.Final]
…省略了43个公共帧
我不确定JPA规范是否支持这种方法,将自定义函数嵌套在聚合函数中,或者这实际上是Hibernate中的一个bug

如果JPA标准实际上不支持这一点,那么为了实现这一方法,我还有哪些其他选择?我已经使用了Hibernate Criteria和Projections.sqlProjection函数,但据我所知,这是不推荐的

编辑1: 实际上,我确实使用EclipseLink尝试了相同的实现,并且它工作正常,因此我更倾向于怀疑这是Hibernate JPA实现本身的一个bug。

我创建它是为了跟踪它。