2011-10-08 2 views
0

최대 절전 모드하는 방법 :Grails는이 짧은을 만들거나 나는 이런 식으로 뭔가 보이는 쿼리있어

SomeDomain.executeQuery(""" 
    from 
     SomeDomain x 
    where 
     x.linkToSomeA = coalesce(:a, x.linkToSomeA) and 
     x.linkToSomeB = coalesce(:b, x.linkToSomeB) and 
     ... 
    """, 
    [a: someA, b: someB, ...] 
) 

의도 된 동작은 다음과 같습니다 null는 기준 매개 변수에 공급되면,이 기준이되어야한다 무시. null이 제공되면 기준이 사용됩니다.

Hibernate가 도메인 클래스 인스턴스가 예상되는 null을 제공 할 수 없다는 점을 제외하면 모든 것이 정상적으로 작동합니다. 따라서 결국 이것은 유효한 쿼리가 아닙니다. null이 제공되면 실제로 NullPointerException이 발생합니다.

if-else을 사용하지 않고 이것을 다시 쓰는 방법을 찾지 못했습니다. 아무도 이것에 대해 어떤 생각을 가지고 있습니까 동등하게 간단하고 유효 동시에?

참고 : 실제 검색어는 그보다 복잡하므로 제발, executeQuery 이외의 것을 사용하여 다시 작성하지 마십시오.

답변

3

이이 기준 API를 사용하는 이런 종류의 문제에 대한 일반적 : 동적으로 쿼리를 작성 할 수 있습니다 :

Criteria c = session.createCriteria(SomeDomain.class, "x"); 
if (a != null) { 
    c.add(Restrictions.eq("x.linkToSomeA", a)); 
} 
if (b != null) { 
    c.add(Restrictions.eq("x.linkToSomeB", b)); 
} 
// ... 

이 답변이 executeQuery 것보다 다른 것을 사용하지 않는 요청을 수행하지 않지만, 스크루 드라이버 이외에 아무것도 사용하지 않고 집을 짓는 법을 묻는다면 가장 좋은 대답은 여전히 ​​"다른 도구를 사다"가 될 것입니다. 이 같은지도와 findAll(), 사용할 수 있는지

+0

문제는 내가 버그로 인해 기준을 사용할 수 없음을 확인한 마지막 시간입니다. 하지만 어쩌면 당신 말이 맞아요. 그리고 정말로 어떤 방법도 없습니다. – julkiewicz

1

궁금 해요 : 이것은 PARAMS지도에서 null이 아닌 매개 변수가 모든 쿼리 요소의 목록을 반환해야

def query = [ 
    'a': 'x.linkToSomeA = :a', 
    'b': 'x.linkToSomeB = :b' 
].findAll{ k, q -> params[k] != null }.values().join(' and ') 

SomeDomain.executeQuery(""" 
    from 
     SomeDomain x 
    where 
     ${query} 
    """, 
    params 
) 

(이 있어야한다 쿼리에서 사용 된 맵과 일치하도록 변경). 기본지도의 "키"를 기준으로 필터링을 제거한 다음 and 값을 합치면됩니다.

잠재적 인 문제가 있습니다. 매개 변수가 전혀없는 경우입니다. 이 경우 query이 비어 있는지 확인하거나 대체 방법을 제공해야합니다.

관련 문제