1

Grails 2.3.4를 사용하고 있습니다. 특정 조건을 가진 도메인 개체를 검색하려고하지만 속성이 null 일 때 문제가 발생합니다. 다음은 그 예입니다.Grails - if와 else from null 속성을 가진 createCriteria

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) 
     ... 
    } 
} 

쿼리 만 locationId은 도메인 1에서 유효한 경우, 하나의 도메인 1을 반환한다고 가정하고, null가 아닌 경우 도메인 2에 유효 locationId하고, null가 아닌 경우 DOMAIN3에 유효 locationId된다.

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()) 
     } 
     } 
    } 
} 

무엇이 누락 되었습니까? domain2와 domain3이 null이 아니면 쿼리가 정상적으로 작동합니다.

+0

당신은'isNotNull ("도메인 2")'과'isNotNull ("DOMAIN3")을 찾고 하여서는 아니된다'대신? – dmahapatro

+0

또는 절 안에 있기 때문에 메커니즘이 첫 번째 true 문으로 종료되지 않습니까? –

답변

3

기본적으로 Grails 기준 쿼리는 내부 조인을 사용합니다. 당신이 후있어 조건부 동작을 달성하기 위해, 왼쪽에 변화가 조인

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) 
    } 
} 
+0

그게 전부 였어. 고맙습니다. –

+0

@Andrew 도메인이 null이 아니고 플래그를 확인하지 않는지 확인하기 위해 비슷한 조건이 발생했습니다. 이것은 나를 위해 일했으나 isNull이 도메인에서 작동하는 방법을 얻지 못했고 올바른 결과를 주었고 isNotNull은 왜 그렇게하지 못했습니다. 설명해 주시겠습니까? –