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

Grails中使用Hibernate Criteria动态拼接And/Or查询无结果如何解决?

问题原因
  • 你的条件拼接逻辑错误:当前代码把每个ilike校验单独包裹在独立的or块中,且所有or块直接嵌套在and块下。Hibernate Criteria在and块内的所有同级子条件默认按AND逻辑拼接,单条件的or块等价于条件本身,最终生成的查询逻辑为同时匹配所有传入的ticket前缀,自然无法返回结果。
  • 你需要实现的是匹配任意一个传入的ticket前缀,所以要把所有ticket相关的ilike条件放在同一个or块内。
正确实现代码

基础版本(仅ticket前缀匹配)

如果没有其他需要同时满足的查询条件,直接使用or块包裹所有ilike即可:

if (params."chartsForm[tickets][]" != null) {
    def tickets = params."chartsForm[tickets][]"
    or {
        tickets.each { ticket ->
            ilike("ticketCode", "${ticket}%")
        }
    }
}

带其他AND条件的版本

如果还有其他需要同时满足的查询条件,把or块放在and块内部即可:

if (params."chartsForm[tickets][]" != null) {
    def tickets = params."chartsForm[tickets][]"
    and {
        // 其他需要同时满足的固定条件写在这
        // eq("status", 1) 示例:校验状态为生效
        
        // ticket前缀匹配为OR关系
        or {
            tickets.each { ticket ->
                ilike("ticketCode", "${ticket}%")
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Alejandro Pacheco Tejeda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:24:03