Java Hibernate 在 hql 中使用 case when else 查询导致的异常
Java Hibernate use of case when else query resulting exception in hql
使用此查询:
需要获得排名不等于 0 的关键字 ID 的最低排名搜索引擎是 "xyz.com",如果关键字 ID 没有除 0 以外的排名,那么它应该显示为 10000
TrackId | KeywordId | 搜索引擎 | 排名
1 | 101 | xyz.com | 0
1 | 101 | xyz.com | 55
1 | 101 | xyz.com | 12
2 | 201 | xyz.com | 1
2 | 201 | xyz.com | 98
2 | 201 | xyz.com | 23
3 | 301 | xyz.com | 0
3 | 301 | xyz.com | 0
结果应该是:
最低排名
12
1
10000
当我使用如下所示的 hql 查询时,我得到的结果是异常:
bestRanks[i] = (List<Integer>)getHibernateTemplate().findByNamedParam("Select min(case when Rank > 0 then Rank else 10000 end) from Serpstrackhistory t where t.keywordId in (:KeywordId) and t.searchEngine=(:SearchEngine) group by KeywordId ORDER BY FIELD(KeywordId,t.keywordId in (:KeywordIds))",new String[]{"KeywordId", "SearchEngine", "KeywordIds"}, new Object[]{keywordId ,searchEngine[i], keywordId});
异常:
java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.AggregateNode
\-[AGGREGATE] AggregateNode: 'min'
\-[CASE] CaseNode: 'case'
+-[WHEN] SqlNode: 'when'
| +-[GT] BinaryLogicOperatorNode: '>'
| | +-[IDENT] IdentNode: 'Rank' {originalText=Rank}
| | \-[NUM_INT] LiteralNode: '0'
| \-[IDENT] IdentNode: 'Rank' {originalText=Rank}
\-[ELSE] SqlNode: 'else'
\-[NUM_INT] LiteralNode: '10000'
当我使用如下原始查询时,我得到的结果是正确的:
SELECT min(case when Rank > 0 then Rank else 10000 end) FROM `serpstrackhistory` WHERE KeywordId in (1,2,3) and SearchEngine="xyz.com" group by KeywordId
请帮助我知道我的 hql 查询中有什么不正确的地方。
请尝试使用别名进行查询 -
min(case when t.Rank > 0 then t.Rank else 10000 end)
使用此查询:
需要获得排名不等于 0 的关键字 ID 的最低排名搜索引擎是 "xyz.com",如果关键字 ID 没有除 0 以外的排名,那么它应该显示为 10000
TrackId | KeywordId | 搜索引擎 | 排名
1 | 101 | xyz.com | 0
1 | 101 | xyz.com | 55
1 | 101 | xyz.com | 12
2 | 201 | xyz.com | 1
2 | 201 | xyz.com | 98
2 | 201 | xyz.com | 23
3 | 301 | xyz.com | 0
3 | 301 | xyz.com | 0
结果应该是:
最低排名
12
1
10000
当我使用如下所示的 hql 查询时,我得到的结果是异常:
bestRanks[i] = (List<Integer>)getHibernateTemplate().findByNamedParam("Select min(case when Rank > 0 then Rank else 10000 end) from Serpstrackhistory t where t.keywordId in (:KeywordId) and t.searchEngine=(:SearchEngine) group by KeywordId ORDER BY FIELD(KeywordId,t.keywordId in (:KeywordIds))",new String[]{"KeywordId", "SearchEngine", "KeywordIds"}, new Object[]{keywordId ,searchEngine[i], keywordId});
异常:
java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.AggregateNode
\-[AGGREGATE] AggregateNode: 'min'
\-[CASE] CaseNode: 'case'
+-[WHEN] SqlNode: 'when'
| +-[GT] BinaryLogicOperatorNode: '>'
| | +-[IDENT] IdentNode: 'Rank' {originalText=Rank}
| | \-[NUM_INT] LiteralNode: '0'
| \-[IDENT] IdentNode: 'Rank' {originalText=Rank}
\-[ELSE] SqlNode: 'else'
\-[NUM_INT] LiteralNode: '10000'
当我使用如下原始查询时,我得到的结果是正确的:
SELECT min(case when Rank > 0 then Rank else 10000 end) FROM `serpstrackhistory` WHERE KeywordId in (1,2,3) and SearchEngine="xyz.com" group by KeywordId
请帮助我知道我的 hql 查询中有什么不正确的地方。
请尝试使用别名进行查询 -
min(case when t.Rank > 0 then t.Rank else 10000 end)