Grails使用Criteria查询PaymentRecord嵌套关联Area的areaCode失败如何解决
错误原因
- 关联查询上下文属性引用错误:使用
area{}闭包声明关联查询后,查询上下文已经切换到Area实体,闭包内直接写Area的属性名即可,不需要再加area.前缀。你代码中eq("area.areaCode", "$areas")的写法会尝试匹配Area下不存在的area.areaCode属性,导致查询失效。 - 场景覆盖不全:当前仅处理了
areas为单字符串的场景,若前端传入多个区域参数,params."chartsForm[areas][]"会返回List类型,对应筛选逻辑会被直接跳过。
修复代码
def paymentRecordList = PaymentRecord.createCriteria().list { def areas = params."chartsForm[areas][]" // 先判断areas非空再走筛选逻辑 if (areas) { area { if (areas instanceof String) { // 单区域匹配,直接写areaCode即可 eq("areaCode", areas) } else { // 多区域匹配,注意in是Groovy关键字需要用引号包裹 'in'("areaCode", areas) } } } // 其他查询条件写在下方 }
可选优化
如果查询时需要同时返回关联的Area属性避免懒加载额外查询,可以在查询根层级加入一行配置提升性能:
fetchMode "area", FetchMode.JOIN
内容的提问来源于stack exchange,提问作者Alejandro Pacheco Tejeda
相关产品推荐
相关产品推荐

