spring jpa @Query错误,期待CLOSE,发现'('附近

时间:2016-04-07 12:14:24

标签: java spring spring-data spring-data-jpa

我有以下JPQL:

@Query("SELECT su.id, su.nameCn, count(b.id), avg(s.rate), count(concat(b.id, '@', s.user.id)) "
            + "FROM S su, B b, S s where b.st.id = su.id and s.bd.id = b.id and su.mt.id = ?1 group by su.id")

当我添加concat(b.id, '@', s.user.id)时,它会显示我:

  

org.hibernate.hql.internal.ast.QuerySyntaxException:期待CLOSE,找到'('靠近第1行,       在org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74)〜[hibernate-core-5.1.0.Final.jar:5.1.0.Final]       在org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:91)〜[hibernate-core-5.1.0.Final.jar:5.1.0.Final]       在org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:288)〜[hibernate-core-5.1.0.Final.jar:5.1.0.Final]       在org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:187)〜[hibernate-core-5.1.0.Final.jar:5.1.0.Final]       在org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:142)〜[hibernate-core-5.1.0.Final.jar:5.1.0.Final]       在org.hibernate.engine.query.spi.HQLQueryPlan。(HQLQueryPlan.java:115)〜[hibernate-core-5.1.0.Final.jar:5.1.0.Final]       在org.hibernate.engine.query.spi.HQLQueryPlan。(HQLQueryPlan.java:76)〜[hibernate-core-5.1.0.Final.jar:5.1.0.Final]       在org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:150)〜[hibernate-core-5.1.0.Final.jar:5.1.0.Final]       在org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:302)〜[hibernate-core-5.1.0.Final.jar:5.1.0.Final]       在org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:240)〜[hibernate-core-5.1.0.Final.jar:5.1.0.Final]       在org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1907)〜[hibernate-core-5.1.0.Final.jar:5.1.0.Final]       在org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:291)〜[hibernate-entitymanager-5.1.0.Final.jar:5.1.0.Final]

2 个答案:

答案 0 :(得分:9)

  

期待CLOSE,找到(

此处的CLOSE一词指的是结束括号)

看起来查询解析器不支持在count(...)内调用另一个函数。

换句话说,语法错误在这里:

SELECT su.id, su.nameCn, count(b.id), avg(s.rate), count(concat(b.id, '@', s.user.id))
                                                               ^

也许你的意思是做某种连接,并计算那里的行?

答案 1 :(得分:0)

问题是同时使用count和concatenate函数。

如果你编写没有count()的查询,如下所示,应该可行。 这只是为了测试知道究竟是谁造成了问题。

尝试使用count以不同方式编写查询并单独连接。

...concat(b.id, '@', s.user.id)....