2013-08-12 2 views
1

데이터베이스의 도메인 클래스 인스턴스에서 지난 20 개의 업데이트 된 레코드를 얻고 싶지만 어떤 경우에는 특정 속성과 구분됩니다. 내 경우에는 color입니다. 나는 3 가지 접근 방식을 시도했지만 아무도 예상대로 작동하지 않는 것 같습니다.Grails 기준을 사용하여 하나의 속성에 대한 별개의 결과 얻기

첫 번째 방법 :

def corridors = TerminKorridor.findAll([max:20, sort:'lastUpdated', order:"desc"]).color.unique();

작동하지만 반환하지 않습니다 20 개 항목

두 번째 방법 :

def corridors = corridorsCriteria.list{ 
      distinct("color") 
      maxResults(20) 
      order("lastUpdated", "desc") 
     } 

은 같은 색상으로 항목을 제거하지 않습니다 . 고유

세 번째 접근 방법을 작동하지 않습니다

def corridors = TerminKorridor.executeQuery("Select distinct a.color from TerminKorridor a order by a.lastUpdated desc",[max:20]) 

이 같은 색상으로 항목을 삭제하지 않습니다 distinct이 작동하지 않습니다.

답변

1

그래서 여기 어딘가에 로직에 문제가 있다고 생각합니다.

목표는 lastUpdated에서 주문한 20 가지 고유 색상 목록을 얻는 것입니다.

고유 목록을 원하면 lastUpdated로 주문할 수 없습니다. 그것은 말이되지 않습니다. 같은 색상의 항목이 3 개있는 경우, 마지막으로 업데이트를 주문 하시겠습니까?

당신은 당신이 지난 20 개 기록하고 거의 확실히 당신은 서로 다른 20의 목록을 얻을 미만 20 개 기록

또는

초래 색상의 별개의 목록을 얻는 경우 선택해야 색깔

당신은 어떤 부호로 이것을 할 수 있었다.

LinkedHashSet<Color> colors = new LinkedHashSet() 

try { 
    TerminKorridor.findAll([sort:'lastUpdated', order:"desc"]).each { 
     if (colors.size() < 20) { 
      colors.add(it.color) 
     } else { 
      throw new GetOutOfHereException() 
     } 
    } 
} catch(GetOutOfHereException e) { 
null 
} 

당신은 전체 개체

TerminKorridor.executeQuery("select t.color from TerminKorridor t order by t.lastUpdated desc").each { ... } 
+0

이이 옵션 대신 색상을로드하는 HQL을 사용하여이 더 잘 만들 수 있습니다! – Jacob

+0

와우, 프로그램 흐름에 예외를 사용하는 것은 큰 일이 아닙니다. 루프에서 벗어나기 위해 'true'를 반환하는 것과 같은 몇 가지 대안을 보려면이 대답 (http://stackoverflow.com/a/3050218/1110820)을 확인하십시오. –

+0

이것이 나쁜 생각 인 이유에 대한 자세한 내용은 http://stackoverflow.com/questions/729379/why-not-use-exceptions-as-regular-flow-of-control을 참조하십시오. –