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
相关产品推荐
相关产品推荐

