2011-09-06 2 views
0

1 대 다수 관계가 포함 된 도메인 클래스가 있습니다. 하나의 CreditProvider은 많은 Rate을 가질 수 있습니다. 기준 쿼리로 오늘 평가되지 않은 CreditProvider을 모두 선택하고 싶습니다 (또는 다른 방법으로는 불가능한 경우).Grails - Criteria, exclusive selection

def criteria = CreditProvider.createCriteria() 
def forgottenCreditProvidersToday = criteria.list { 
       rates { 
         between('dateCreated', dateTodayAtMidnight, dateTodayAndNow) 
       } 
      } 
} 

가 어떻게 반대를 선택할 수있는 아직 오늘 평가되지 않은 CreditProviders 말을한다 :

여기에 오늘 평가 모든 CreditProviders를 검색하는 쿼리는? 또한, 내가 왜 열심히 요금이 방법을 가져 오기 위해 관리하지 않는 :

fetchMode("rates", FM.EAGER) 

는 당신의 도움을 주셔서 감사합니다.


편집 : Provisory 솔루션 :

def criteria = CreditProvider.createCriteria() 

     def creditProvidersRatedToday = criteria.list { 
      rates { 
        gt('dateCreated', dateTodayAtMidnight) 
     } 
    order "originalName", "asc" 
} 
def creditProviders = CreditProvider.findAll() 

creditProviders.removeAll (creditProvidersRatedToday)

내가 더 우아한 해결책 :

답변

1

,이 기준이 하위 쿼리를 지원하지 않는

select * from credit_provider 
inner join rates on rates.credit_provider_id = credit_provider.id 
where not exists 
    (select id from rates where dateCreated between ? and ?) 

Grails는 같은 하위 쿼리를 필요로한다. 비록 HQL does support subqueries입니다. 이것을 HQL로 변환 할 수 있습니다.

-2

반대는 일반적으로 열어주는 말들 에 의해 달성 된 "아닙니다", 예를 들면 SQL을 결과에

def criteria = CreditProvider.createCriteria() 
def forgottenCreditProvidersToday = criteria.list { 
    rates { 
     not { 
      between('dateCreated', dateTodayAtMidnight, dateTodayAndNow) 
     } 
    } 
} 

}

+0

잘못 - 'CreditProvider'에 대해 많은'Rate'가 있기 때문에 'CreditProvider'가 오늘 평가되었지만 범위 밖의'Rate'가있을 것입니다. –