具有null属性的Hibernate OR条件

时间:2015-08-20 21:42:19

标签: hibernate grails gorm

我有一个Grails域对象的过滤器页面,它有一个搜索多个域字段的过滤器字段。我在单个like(..)子句中有多个or过滤器,以便在其任何字段匹配时列出对象。主对象上的一个字段是另一个域对象,因此标准代码如下所示:

    or{
            like("field1", "%" + params.generalFilterValue + "%")
            like("field2", "%" + params.generalFilterValue + "%")
            like("field3", "%" + params.generalFilterValue + "%")
            otherDomainObject{
                like("field4", "%" + params.generalFilterValue + "%")
            }

    }

但是,当“otherDomainObject”为null时,即使其中一个字段匹配,也不会列出该对象。

有什么方法吗?

2 个答案:

答案 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}%"
    }
}