【问题标题】:Hibernate OR criteria with null property具有空属性的休眠 OR 条件
【发布时间】:2015-08-20 21:42:18
【问题描述】:

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

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

    }

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

有没有办法解决这个问题?

【问题讨论】:

    标签: hibernate grails grails-orm


    【解决方案1】:

    条件中的关联始终是内连接,因此如果关联为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 + "%")
        }
    }
    

    【讨论】:

      【解决方案2】:

      使用其他 CriteriaSpecification 方法的另一个选项,但您必须在 left join 之前调用它:

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

      【讨论】:

        猜你喜欢
        • 2015-08-13
        • 2016-10-04
        • 2014-02-04
        • 2012-04-09
        • 2017-12-25
        • 2013-12-07
        • 2012-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多