Грааль - критерии, эксклюзивный выбор - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть класс домена, содержащий отношение 1 ко многим.Один CreditProvider может иметь много Rate с.Я хотел бы выбрать все CreditProvider, которые не были оценены сегодня с помощью критерия запроса (или другого, если это невозможно, таким образом), и я застрял.

Вот запрос для получения всех CreditProviders, оцененных сегодня:

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

Как я могу выбрать противоположное, то есть CreditProviders, которые еще не были оценены сегодня?Кроме того, почему мне не удается с готовностью получить ставки таким образом:

fetchMode("rates", FM.EAGER)

Большое спасибо за вашу помощь.


РЕДАКТИРОВАТЬ: Обязательное решение:

def criteria = CreditProvider.createCriteria()

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

creditProviders.removeAll (creditProvidersRatedToday)

Я открыт для любого более элегантного решения:)

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

В результирующем SQL для этого потребуется подзапрос, например

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 поддерживает подзапросы - вы можете перевести это на HQL.

0 голосов
/ 06 сентября 2011

противоположность обычно достигается "не", например

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

}

...