Hibernate HQL - 在COUNT语句中使用CASE WHEN,如MySQL中的IF

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中执行此操作?还有另一种更好的方法,比如重组表格,专家对此有何看法?

rua*_*akh 9

我绝不是专家 - 当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)

(虽然你可能还需要包装你SUMCOALESCE(..., 0)- 我不确定).