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

HQL排除Type C查询失效:求正确的非原生HQL语句

解决HQL查询仍返回Type C数据的问题

嘿,你这明显是踩了逻辑运算符优先级的坑啦!

问题根源

在HQL(以及标准SQL)中,AND的优先级比OR高,所以你原来的查询语句会被数据库解析成这个逻辑:

(i.type NOT IN ('C') AND i.name LIKE %:icdString%) 
OR i.code LIKE %:icdString% 
OR i.desc LIKE %:icdString%

这就意味着,只要code或者desc匹配了搜索字符串,不管这条数据的type是不是C,都会被返回——完全绕开了你设置的type过滤条件!

正确的HQL语句

你需要把所有OR连接的匹配条件用括号括起来,确保它们作为一个整体和type NOT IN ('C')的条件做AND判断:

@Query("SELECT i FROM ICD10CM i WHERE i.type NOT IN ('C') AND (i.name LIKE %:icdString% OR i.code LIKE %:icdString% OR i.desc LIKE %:icdString%)")
List<ICD10CM> getICD10CMBySearch(@Param("icdString") String icdString);

也可以把i.type NOT IN ('C')换成i.type != 'C',效果是完全一样的,核心就是用括号明确逻辑分组。

这样修改后,查询会先检查括号内的三个字段是否有任意一个匹配搜索字符串,再验证这条数据的type不是C,最终返回的结果就会完全排除Type C类型的数据啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:04:08