Работа с частью запроса одновременно - PullRequest
3 голосов
/ 29 октября 2010

У меня есть запрос гибернации, который возвращает десятки тысяч результатов объекта. Можно ли циклически проходить по частям запроса, а не обрабатывать весь запрос сразу?

Пример кода:

Query q = session.createQuery("FROM Class");


List<Class> classList = (List<Class>) q.list();

Спасибо

Ответы [ 2 ]

1 голос
/ 29 октября 2010

Вы можете использовать ScrollableResults из спящего режима

Что-то вроде:

ScrollableResults results = session.createCriteria(Project.class)
            .add(Restrictions.eq("projectType", Constants.REINDEX.PROJECT_TYPE))
            .setFetchSize(10)
            .scroll(ScrollMode.FORWARD_ONLY);

while (results.next()) {
        project = (Project) results.get(0);

Если вы просматриваете огромное количество сущностей, вам, вероятно, также следует очистить ваш сеанс время от времени, иначе вы можете исчерпать память.

Дополнительную информацию можно найти в документации 10.4.1.6. Прокручиваемая итерация и, как они ее написали, вы должны использовать нумерацию страниц, если не хотите, чтобы ваше соединение оставалось открытым.

1 голос
/ 29 октября 2010

Используйте query.setMaxResults (int) и query.setFirstResult (int) для пролистывания запроса.

Обычно вы пишете метод, который отображает страницу x с размером результата, где y - количество элементов на странице:

public List<Thingy> showThingies(int itemsPerPage, int pageOffest){
    // ..
    query.setMaxResults(itemsPerPage);
    query.setFirstResult(itemsPerPage * pageOffset);
    // ..
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...