Grails разбивает результаты базы данных на страницы в одной транзакции?

Я хотел бы иметь возможность разбивать результаты моей базы данных на страницы с помощью чего-то вроде CriteriaBuilder, но мне нужно, чтобы мои результаты были согласованы в отношении одного момента времени.

Есть ли простой способ разбить на страницы и сохранить выбор в той же транзакции /


person Stefan Kendall    schedule 17.05.2011    source источник
comment
Очевидно, вы могли бы сделать это, сохранив все результаты в кеше (например, сеансе), но это лишило бы одного из основных преимуществ разбиения на страницы, то есть извлечения только тех записей, которые вам нужны. Хороший вопрос, с нетерпением жду еще нескольких полезных ответов, чем этот.   -  person Dónal    schedule 17.05.2011


Ответы (2)


Вы отказались от сохранения всего набора результатов в памяти с помощью ScrollableResult?

Посмотрите здесь

DomainObject.createCriteria().scroll{} возвращает ScrollableResult

person ssedano    schedule 17.05.2011
comment
Как мне использовать это в Grails? Это то, что мне нужно, но я хотел бы указать размер группировки результатов. - person Stefan Kendall; 17.05.2011
comment
Извините, я не могу вам помочь с граалями. В спящем режиме вы можете перемещать или просто перебирать коллекцию. - person ssedano; 18.05.2011
comment
Документация Grails содержит информацию о том, как получить прокручиваемый ResultSet из запроса Criteria: grails.org/doc/latest/ref/Domain%20Classes/createCriteria.html - person Ruben; 18.05.2011

Укажите желаемое смещение в критериях на основе текущего номера страницы.

def results = DomainClass.withCriteria {
   firstResult ( (currentPageNumber - 1) * itemsPerPage)
   maxResults (itemsPerPage)
}

Чтобы узнать общее количество страниц, вам понадобится другой запрос:

def numberOfPages = DomainClass.count()
if(numberOfPages != 0) numberOfPages = numberOfPages / itemsPerPage + 1
person Gabriel    schedule 17.05.2011
comment
Все это происходит в одной транзакции? - person Stefan Kendall; 17.05.2011
comment
Да, он не загружает строки, выходящие за пределы указанного диапазона. - person Gabriel; 17.05.2011
comment
Я не совсем уверен, что вы понимаете, о чем я. Если строка 11 обновляется, пока я извлекаю строки 1-10, мне не нужно обновление. - person Stefan Kendall; 17.05.2011
comment
Если вы не хотите загружать все результаты одновременно, это невозможно сделать. Насколько важно экономить память? Если это не так, вы можете просто перечислить все результаты и сохранить их в объекте сеанса (результаты session.setAttribute, DomainClass.list ()). Затем читайте из сеанса, а не из базы данных, и вы не увидите дальнейших изменений. Проблемы возникают, когда набор результатов большой. - person Gabriel; 17.05.2011
comment
Нет, ты ошибаешься. Похоже, ScrollableResult делает именно то, что мне нужно, с базами данных, которые это поддерживают. - person Stefan Kendall; 17.05.2011
comment
Хорошо, но без кеширования всех результатов? Разве он не загружает все сначала? Если так и получится, то я действительно впечатлен. Но все равно, как долго ты живешь, так долго учишься :) - person Gabriel; 17.05.2011