private PaginationResult<EmployeeEntity>
paginateUsingScrollableResults(int pageNumber, int pageSize) {
int lastPageNumber = 0;
int totalRecords = 0;
List<EmployeeEntity> employeeList = new ArrayList<>();
try (Session session = sessionFactory.openSession()) {
session.getTransaction().begin();
Query<EmployeeEntity> query = session.createQuery("From " +
"EmployeeEntity e ORDER BY e.id",
EmployeeEntity.class);
try (ScrollableResults resultScroll =
query.scroll(ScrollMode.SCROLL_INSENSITIVE)) {
boolean hasRecords = resultScroll.first();
if (hasRecords) {
int fromRecordIndex = (pageNumber - 1) * pageSize;
int maxRecordIndex = (fromRecordIndex + pageSize) - 1;
hasRecords = resultScroll.scroll(fromRecordIndex);
if (hasRecords) {
do {
EmployeeEntity employee = (EmployeeEntity) resultScroll.get();
employeeList.add(employee);
} while (resultScroll.next()
&& resultScroll.getRowNumber() >= fromRecordIndex
&& resultScroll.getRowNumber() <= maxRecordIndex);
}
resultScroll.last();
totalRecords = resultScroll.getRowNumber() + 1;
if (totalRecords % pageSize == 0) {
lastPageNumber = (int) (totalRecords / pageSize);
} else {
lastPageNumber = (int) (totalRecords / pageSize) + 1;
}
}
}
session.getTransaction().commit();
}
PaginationResult<EmployeeEntity> result = new PaginationResult<>();
result.setCurrentPageNumber(pageNumber);
result.setPageSize(pageSize);
result.setLastPageNumber(lastPageNumber);
result.setTotalRecords(totalRecords);
result.setRecords(employeeList);
return result;
}