You need to enable JavaScript to run this app. 如何在HQL中组合is null判断与if else条件实现type参数动态过滤
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 23:45:03