Принудительный порядок перед смещением и максимумом в запросе
У меня есть запрос в Grails, который построен с использованием createCriteria()
, Как я могу заставить выполнить сортировку по результату, а затем применить смещение макс ограничения.
Код:
def history = Termin.createCriteria().list([max:10, offset:offset]) {
and{
//some query constraints
}
order('id', 'desc')
}
Это вероятно сделало бы то же самое:
def history = Termin.createCriteria().list([max:10, offset:offset,order:'desc',sort:'id']) {
and{
//some query constraints
}
}
База данных - это postgreSQL 7.5, а встроенный запрос выглядит так:
select
something
from
somewhere
left outer join
something
on something
left outer join
something
on something
left outer join
something
on something
where
(
something
)
order by
this_.th_id desc limit ? offset ?
1 ответ
Сортировка уже правильно обрабатывается Hibernate при использовании смещения и максимума в запросах.
Если вы включите вывод, вы увидите произведенный запрос. В Oracle, например, они делают трюк, так как он не содержит эту функцию для запросов.
Пример сгенерированного запроса:
select * from
( select a.*, ROWNUM rnum from
( <your_query_goes_here, with order by> ) a
where ROWNUM <= :MAX_ROW_TO_FETCH )
where rnum >= :MIN_ROW_TO_FETCH;