【问题标题】:spring jpa @Query error, expecting CLOSE, found '(' nearspring jpa @Query 错误,期待 CLOSE,发现 '(' 附近
【发布时间】:2016-07-28 07:35:55
【问题描述】:

我有以下 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]

【问题讨论】:

  • 看来你不允许在count()中嵌套函数调用。

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


【解决方案1】:

期待关闭,找到(

这里的术语 CLOSE 指的是一个右括号,)

查询解析器似乎不支持在count(...) 中调用另一个函数。

也就是说语法错误在这里:

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

也许您的意思是进行某种联接,并计算那里的行数?

【讨论】:

  • 是的,我想要的正是 count(concat(b.id, '@', s.user.id))。如果我不能这样写,有什么办法可以代替这种格式
  • 你想要的没有任何意义。 concat 函数不会改变行数。
  • 如果我只计算b.id,它会给我4条记录,如果我计算(concat(b.id,'@',s.user.id)),这实际上是b.id和 s.user.id 作为唯一键,我会得到 2 条记录,缩小搜索结果
  • 您需要编写适当的连接/位置查询并计算其中的行数。
【解决方案2】:

问题是同时使用计数和连接函数。

如果您在没有 count() 的情况下编写查询,如下所示,应该可以。 这只是为了测试以了解究竟是谁导致了问题。

尝试使用不同的方式编写查询,分别使用计数和连接。

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

【讨论】:

  • 是的,我已经测试了是否只添加计数(b.id),它可以工作。但实际上我想要count(concat(b.id,'@',s.user.id)),当我添加concat时,它会显示错误。那么你知道如何在 spring data 中写成这样的格式 count(concat(b.id, '@', s.user.id))
猜你喜欢
  • 2022-01-23
  • 2019-12-01
  • 2019-12-22
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多