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

HQL中正确否定IS语句的语法?Boolean字段查询报错解决

解决HQL中Boolean字段查询不为true的语法问题

这个问题我之前也碰到过,HQL对布尔类型的null值处理有特定的语法要求,你写的not true不符合HQL的语法规范,所以才会抛出"unexpected token: true"的错误。下面给你几个可行的解决方案:

方案1:使用is not true(推荐,最简洁)

HQL专门提供了is true/is not true这类语法来处理布尔字段的null情况,is not true会直接匹配字段为false或者null的记录,完全符合你的需求:

select new my.package.UserModel(u.uuid, d.userDataId, .....) 
from User u left join u.userData d 
where u.uuid = :id AND u.shallBeDeleted is not true 
order by d.modified desc

这个写法不仅简洁,还能正确处理null值——HQL会把null视为“不是true”的情况,正好覆盖你需要的两种场景。

方案2:显式判断null和false

如果你更倾向于直观易懂的写法,可以分开判断字段为null或者false的情况:

select new my.package.UserModel(u.uuid, d.userDataId, .....) 
from User u left join u.userData d 
where u.uuid = :id AND (u.shallBeDeleted is null or u.shallBeDeleted = false) 
order by d.modified desc

这种写法逻辑清晰,即使是对HQL不太熟悉的团队成员也能一眼看懂含义。

方案3:用coalesce转换null值

利用coalesce函数将null值替换为false,再判断是否等于false:

select new my.package.UserModel(u.uuid, d.userDataId, .....) 
from User u left join u.userData d 
where u.uuid = :id AND coalesce(u.shallBeDeleted, false) = false 
order by d.modified desc

coalesce函数会返回第一个非null的参数,所以当shallBeDeleted为null时,会自动用false代替,这样判断等于false就包含了原字段为null或false的所有情况。

为什么原写法报错?

HQL的语法规则里,not关键字是用来否定完整的布尔表达式(比如not (u.shallBeDeleted = true)),而不能直接跟true这种字面量。你的写法u.shallBeDeleted not true不符合HQL的解析规则,所以会被识别为语法错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:23:52