如何在HQL中组合is null判断与if else条件实现type参数动态过滤
解决方案
逻辑说明
你需要的筛选逻辑本质为参数非空时匹配对应值、参数为空时跳过该条件,直接使用你已知的isNull判断语法即可实现,无需额外分支处理。
代码修改
1. 主查询替换type筛选逻辑
把你原来标注为有问题的那段逻辑替换为以下内容即可(注意:如果你的项目type字段确实关联essentials的id,就把p.type改为e.id即可):
"AND (:#{#filterProjectByLocationRequestDto.getType()} IS NULL OR p.type = :#{#filterProjectByLocationRequestDto.getType()}) " +
2. 补全countQuery的type筛选条件
在countQuery的WHERE条件中加入和上面完全一致的type筛选逻辑,避免分页总数计算错误,修改后的countQuery对应片段如下:
"AND layout.bedroom = :#{#filterProjectByLocationRequestDto.numberOfBed} " + // 新增的type筛选条件 "AND (:#{#filterProjectByLocationRequestDto.getType()} IS NULL OR p.type = :#{#filterProjectByLocationRequestDto.getType()}) " + "AND (:#{#filterProjectByLocationRequestDto.getEssentialsList()} is null or e.id in :#{#filterProjectByLocationRequestDto.getEssentialsList()}) " +
可选:CASE语法实现版本
如果你偏好使用CASE分支语法实现,也可以替换为以下写法,效果完全一致:
"AND p.type = CASE WHEN :#{#filterProjectByLocationRequestDto.getType()} IS NULL THEN p.type ELSE :#{#filterProjectByLocationRequestDto.getType()} END " +
同样需要把这段逻辑同步加到countQuery中。
内容的提问来源于stack exchange,提问作者Dattq2303
相关产品推荐
相关产品推荐

