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

