You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HQL查询未返回0值问题:同逻辑SQL语句可正常执行

解决HQL LEFT JOIN后不返回计数为0的记录问题

我之前也碰到过一模一样的问题,这其实是HQL对count()函数和左连接空值的处理逻辑和原生SQL存在细微差异导致的。

问题原因拆解

你的原生SQL里用了count(tbl_leads.lead_Status_Id),当左连接没匹配到tbl_leads的记录时,这个字段值会是NULL,而count(列名)会自动忽略NULL值,最终统计结果为0;再加上GROUP BY是基于左表tbl_LeadStatus的类型,所以所有状态类型都会被保留下来。

但你的HQL语句里写的是count(l.status),当左连接没有匹配到Lead记录时,l本身是null,此时访问l.status会触发HQL自动过滤掉这条空关联的记录,最终就只返回了有实际匹配数据的New状态分组。

修复方案

只需要把HQL里的计数逻辑从count(l.status)改成count(l),就能正确返回所有状态类型的计数(包括为0的记录):

Select s.LeadStatus_Type, count(l) 
FROM Status s 
LEFT JOIN Lead l ON l.status = s.LeadStatus_id 
GROUP BY s.LeadStatus_Type

如果你的Status实体和Lead实体是双向关联的(比如Status类里有一个leads集合属性),更推荐用关联导航的写法,Hibernate能更好地优化这个查询:

Select s.LeadStatus_Type, count(l) 
FROM Status s 
LEFT JOIN s.leads l 
GROUP BY s.LeadStatus_Type

原理说明

count(l)是统计关联的Lead实体的数量,当左连接没匹配到Lead时,l为null,count(l)会直接返回0;同时GROUP BY是基于左表Status的所有类型,所以所有状态类型都会被完整返回,和你预期的结果完全一致。

内容的提问来源于stack exchange,提问作者Harpreet Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:54:44