Grails Detached Criteria Запрос и группировка по и по предложению

В приложении 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?

Спасибо


person Michael Kohout    schedule 23.05.2013    source источник


Ответы (1)


Я просто сделал это с помощью hql.

select cci from CompletedCase as cci where id in (
            select min(id) from CompletedCase group by caseId
        ) and cci.completedDate > :startDate and cci.completedDate < :endDate and cci.status = :status
        order by cci.id
person Michael Kohout    schedule 23.05.2013