Hibernate Group By Query

时间:2014-10-13 19:37:28

标签: java database hibernate jpa hql

请帮我理解这个查询有什么问题。

String sql = "select d.arc_alrt_cde, d.alrt_desc, count(d.arc_alrt_cde) " +
"from arc_alrt a, arc_alrt_def d " +
"where d.arc_alrt_cde = a.alrt_cde " +
"and (a.stat_cde = 'OPEN' or a.stat_cde = 'RE-OPENED') " +
"group by d.arc_alrt_cde, d.alrt_desc "+
"order by count(d.arc_alrt_cde) desc"
println sql
Query query = session.createQuery(sql);

打印SQL

sql = select d.arc_alrt_cde, d.alrt_desc, count(d.arc_alrt_cde) from arc_alrt a, arc_alrt_def d where d.arc_alrt_cde = a.alrt_cde and (a.stat_cde = 'OPEN' or a.stat_cde = 'RE-OPENED') group by d.arc_alrt_cde, d.alrt_desc order by count(d.arc_alrt_cde) desc

获得以下错误。试过IN条款也..不工作..

Error:
java.lang.IllegalArgumentException: node to traverse cannot be null!
    at org.hibernate.hql.internal.ast.util.NodeTraverser.traverseDepthFirst(NodeTraverser.java:64)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:300)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:203)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:126)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:88)

3 个答案:

答案 0 :(得分:1)

这是一个不是HQL的SQL查询,所以你应该使用:

SQLQuery query = session.createSQLQuery(sql);

因为Hibernate需要HQL查询但是接收到SQL查询,所以抛出了你的异常。

答案 1 :(得分:0)

您要命名count字段,例如count(d.arc_alrt_cde) as countOfXXX 并且您的实体也应该与该查询保持一致,否则您应该删除该count字段。

答案 2 :(得分:0)

将其更改为使用对象属性并且它有效。感谢您的投入。

String sql = "select alert.alertCode, def.alertDesc, count(alert.alertCode) " +
                "from ArcAlert as alert, ArcAlertDef as def " +
                "where alert.alertCode = def.alertCode " +
                "and alert.status in ('OPEN', 'RE-OPENED') " +
                "and alert.assignedTo = '"+assignedTo+"' " +
                "group by alert.alertCode, def.alertDesc " +
                "order by count(alert.alertCode) desc"

查询query = session.createQuery(sql);    lst = query.list()