ThE*_*arD 2 mysql hibernate hql
我正在尝试移植一个适用于Hibernate HQL的MySQL查询,这对我来说都是新的,所以我对任何类型的提示都是开放的(错误的方式,错误的结构,改变所有...;))
两个表A和B.(结构细分,只有相关部分)
A包含每个都有唯一ID的entr.B引用这些ID并保存类似布尔的标记(TINYINT(1)).
我想知道A中每行有多少行,其中来自A的行和标记的Id == True(1).
我的MySQL查询是这样的:
SELECT A.id, COUNT( IF( B.marker = 1, 1, NULL ) ) AS markerTrue, COUNT( IF( B.marker =0, 1, NULL ) ) AS markerFalse FROM A LEFT JOIN B ON B.a_id = A.id GROUP BY A.id
Run Code Online (Sandbox Code Playgroud)
它工作,我把它移植到这个(HQL):
SELECT A.id, COUNT(CASE WHEN B.marker = 1 THEN 1 ELSE NULL END) as markerTrue, COUNT(CASE WHEN B.marker = 0 THEN 1 ELSE NULL END) as markerFalse FROM A LEFT JOIN B WITH B.a_id = A.id GROUP BY A.id
Run Code Online (Sandbox Code Playgroud)
这引发了一个异常:
org.hibernate.hql.ast.QuerySyntaxException:意外令牌:CASE附近......
在日志中,也有
org.hibernate.hql.ast.ErrorCounter - 第1:19行:意外令牌:CASE antlr.NoViableAltException:意外令牌:CASE
但那就是内部错误.
有没有办法在HQL中执行此操作?还有另一种更好的方法,比如重组表格,专家对此有何看法?
我绝不是专家 - 当HQL阻碍我时,我很少有通过切换到直接SQL来绕过问题的疑虑 - 所以我不能告诉你是否有更好的,更多的HQL方法来做到这一点.但是在你的特定情况下,B.marker总是在哪里,0或者1,我想你可以改变
COUNT(CASE WHEN B.marker = 1 THEN 1 ELSE NULL END)
Run Code Online (Sandbox Code Playgroud)
至
SUM(B.marker)
Run Code Online (Sandbox Code Playgroud)
和
COUNT(CASE WHEN B.marker = 0 THEN 1 ELSE NULL END)
Run Code Online (Sandbox Code Playgroud)
至
COUNT(*) - SUM(B.marker)
Run Code Online (Sandbox Code Playgroud)
(虽然你可能还需要包装你SUM的COALESCE(..., 0)- 我不确定).
| 归档时间: |
|
| 查看次数: |
15055 次 |
| 最近记录: |