2013-05-23 3 views
1

В приложении Grails 2.1 у меня возникли проблемы с получением запроса на критерии, который будет вести себя как у какого-то написанного вручную sql.Отдельный критерий Grails Query и предложение «group by» и «having»

Так вот некоторая справочная информация:

В таблице в отчетном дб и имеет следующий DDL:

completed_case столбцы таблицы

  • ID
  • completedDate
  • caseState
  • caseId (это поле не является уникальным)
  • состояние
  • некоторые другие столбцы
  • CustomerName, другие столбцы данных

Строка добавляется к этой таблице всякий раз, когда значение для этого случая изменения, поэтому часто бывают> 1 строк на caseId.

Мне было поручено найти первую строку для каждого случая в пределах диапазона doneDate. У меня есть некоторый Hacky 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. Я был угадывая следующее (используя отложенный критерий для выбора sub), но кажется, что у 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?

спасибо

ответ

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 
Смежные вопросы