我有一个Grails域对象的过滤器页面,它有一个搜索多个域字段的过滤器字段。我在单个like(..)
子句中有多个or
过滤器,以便在其任何字段匹配时列出对象。主对象上的一个字段是另一个域对象,因此标准代码如下所示:
or{
like("field1", "%" + params.generalFilterValue + "%")
like("field2", "%" + params.generalFilterValue + "%")
like("field3", "%" + params.generalFilterValue + "%")
otherDomainObject{
like("field4", "%" + params.generalFilterValue + "%")
}
}
但是,当“otherDomainObject”为null时,即使其中一个字段匹配,也不会列出该对象。
有什么方法吗?
答案 0 :(得分:0)
条件中的关联始终是内部联接,因此如果关联为null
,则会丢弃结果集。相反,您可以使用LEFT_JOIN
import static org.hibernate.criterion.CriteriaSpecification.LEFT_JOIN
...
or {
like("field1", "%" + params.generalFilterValue + "%")
like("field2", "%" + params.generalFilterValue + "%")
like("field3", "%" + params.generalFilterValue + "%")
otherDomainObject( LEFT_JOIN ) {
like("field4", "%" + params.generalFilterValue + "%")
}
}
答案 1 :(得分:0)
使用其他CriteriaSpecification方法的另一个选项,但必须在左连接之前调用它:
import org.hibernate.criterion.CriteriaSpecification
/* and here you could use
* 'resultTransformer CriteriaSpecification.ALIAS_TO_ENTITY_MAP'
* if it's necessary */
or {
ilike 'field1', "%${params.generalFilterValue}%"
ilike 'field2', "%${params.generalFilterValue}%"
ilike 'field3', "%${params.generalFilterValue}%"
/* DRY?
[1..3].each{
ilike "field${it}", "%${params.generalFilterValue}%"
} */
otherDomainObject(CriteriaSpecification.LEFT_JOIN) {
ilike 'field4', "%{params.generalFilterValue}%"
}
}