В приложении Grails 2.1 у меня возникли проблемы с тем, чтобы запрос критериев вел себя как какой-то рукописный sql, который у меня есть.
Итак, вот некоторая справочная информация:
Таблица находится в базе данных отчетов и имеет следующий ddl:
Столбцы таблицы complete_case
- id
- Дата завершения
- caseState
- caseId (это поле не уникально)
- состояние
- некоторые другие столбцы
- имя_клиента, другие столбцы данных
Строка добавляется в эту таблицу всякий раз, когда изменяется значение для этого случая, поэтому часто бывает> 1 строки на каждый caseId.
Мне было поручено найти первую строку для каждого случая в диапазоне CompleteDate. У меня есть какой-то хакерский sql, который, кажется, дает мне нужные мне значения:
select * from dbo.completed_case where id in
(select min(id)
from dbo.completed_case cci
group by case_id
having ((min(completed_date) > convert(datetime, 'Oct 19 2012 11:01AM', 100)) and
(min(completed_date) < convert(datetime, 'Oct 21 2012 11:01AM', 100)))) and
status = 'DIAGNOSED'
Но я не знаю, как перевести этот запрос в Grails/Gorm CriteriaQuery. Я догадывался о следующем (используя отдельный критерий для выполнения подвыборки), но похоже, что у DetachedCriteria нет groupPropery(), поэтому я немного растерялся.
В любом случае, вот мое предположение, которое включает недействительный вызов groupProperty:
HibernateCriteriaBuilder criteria = CompletedCase.reports.createCriteria()
def results = criteria {
eqAll("id", new DetachedCriteria(CompletedCase).build {
projections {
min("id")
}
groupProperty("caseId") //XXX this method doesn't exist on DetachedCriteria
between("completedDate", startDate.toDate(), endDate.toDate())
})
eq("status", "DIAGNOSED")
fetchMode 'AssociatedTable', FetchMode.JOIN
}
Есть ли способ сгенерировать этот запрос, используя интерфейсы, предоставляемые Gorm/Grails?
Спасибо