简体   繁体   English

Grails - 来自if和else的createCriteria,带有null属性

[英]Grails - createCriteria from if and else with null property

I am using Grails 2.3.4. 我正在使用Grails 2.3.4。 I am trying to retrieve a domain object with specific criteria, however I have trouble getting around when the properties are null. 我试图检索具有特定条件的域对象,但是当属性为null时我无法绕过。 Here is an example. 这是一个例子。

class Domain1 {
   int locationId
   Domain2 domain2
   Domain3 domain3
   ...
   static constraints = {
      locationId(nullable:false, blank:false, unique:false)
      domain2(nullable:true)
      domain3(nullable:true)
      ...
   }
}

class Domain2 {
   int locationId
   ...
   static constraints = {
      locationId(nullable:false, blank:false, unique:false)
      ...
   }
}

class Domain3 {
   int locationId
   ...
   static constraints = {
      locationId(nullable:false, blank:false, unique:false)
      ...
   }
}

The query is only suppose to return a single Domain1, if the locationId is valid in Domain1, and locationId valid in Domain2 if not null, and locationId valid in Domain3 if not null. 如果locationId在Domain1中有效,则查询仅返回单个Domain1;如果不为null,则locationId在Domain2中有效,而locationId在Domain3中有效(如果不为null)。

def getDomain1ById(Long sid) {
   return Domain1.createCriteria().get {
      idEq(sid)
      'in' ("locationId", Util.getUserAccessLocationList())
      // What I want to do is if(domain2 != null) check location
      or {
         isNull("domain2")
         domain2 {
            'in' ("locationId", Util.getUserAccessLocationList())
         }
      }
      // What I want to do is if(domain3 != null) check location
      or {
         isNull("domain3")
         domain3 {
            'in' ("locationId", Util.getUserAccessLocationList())
        }
      }
   }
}

What am I missing. 我错过了什么 The query works fine if domain2 and domain3 are not null 如果domain2和domain3不为null,则查询工作正常

By default, Grails criteria queries use inner joins. 默认情况下,Grails条件查询使用内部联接。 To achieve the conditional behavior you're after, change to left joins: 要实现您所处的条件行为,请更改为左连接:

Domain1.createCriteria().get {
    createAlias('domain2', 'd2', CriteriaSpecification.LEFT_JOIN)
    createAlias('domain3', 'd3', CriteriaSpecification.LEFT_JOIN)
    idEq(sid)
    'in' ("locationId", locIds)
    or {
        isNull("domain2")
        'in' ("d2.locationId", locIds)
    }
    or {
       isNull("domain3")
       'in' ("d3.locationId", locIds)
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM