To make query result pagination slightly easier to use, introduce Pager, which may be used as follows:
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();
}
Or as follows:
session.createSelectionQuery("from Book where title like :title", Book.class)
.setParameter("title", titlePattern)
.getResultPager(Page.first(pageSize))
.forEachRemainingPage(books -> {
...
session.clear();
});
Or even, more practically for most programs, something like this:
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(). |