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

