To make query result pagination slightly easier to use, introduce {{Pager}}, which may be used as follows:
{code:java} Pager<Book> bookPager = session.createSelectionQuery("from Book where title like :title", Book.class) .setParameter("title", titlePattern) .getResultPager(Page.first(pageSize)); while (bookPager.hasResults()) { List<Book> books = bookPager.getResultList(); ... session.clear(); bookPager.next(); }{code}
Or as follows:
{code:java} session.createSelectionQuery("from Book where title like :title", Book.class) .setParameter("title", titlePattern) .getResultPager(Page.first(pageSize)) .forEachRemainingPage(books -> { ... session.clear(); });{code}
Or even, more practically for most programs, something like this:
{ noformat code:java }scope.inSession(s -> { Page page = Page.first(10); boolean hasMore; do { Pager<Book> pager = s.createSelectionQuery("from Book", Book.class) .getResultPager(Page.first(15)); List<Book> books = pager.getResultList(); hasMore = pager.hasResultsOnNextPage(); page = page.next();
} while ( hasMore ); });{ noformat code }
Here we do not need to keep a {{Pager}} open between requests.
Still need to add {{Page.getTotalPages()}} delegating to a new method {{Query.getResultCount()}}. |
|