The following code can be used for the following requirements
1.) To retrieve limited records to support pagination
2.) To support pagination searching & sorting
final String search, final String sort, final String filter,
final String order) {
final CriteriaBuilder criteriaBuilder = entityManager
.getCriteriaBuilder();
final CriteriaQuery<Employee> criteriaQuery = criteriaBuilder
.createQuery(Employee.class);
final Root<Employee> employeeRoot = criteriaQuery.from(Employee.class);
List<Predicate> criteriaList = new ArrayList<Predicate>();
if (!StringUtils.isEmpty(search)) {
Predicate predicateSearch = criteriaBuilder.like(
criteriaBuilder.upper(employeeRoot.get("name").as(
String.class)), "%" + search + "%");
criteriaList.add(predicateSearch);
}
));
if (!StringUtils.isEmpty(filter)) {
Predicate predicateFilter = criteriaBuilder.equal(
criteriaBuilder.upper(employeeRoot.get("status").as(
String.class)), filter );
criteriaList.add(predicateFilter);
}
if (!StringUtils.isEmpty(sort)) {
if (!StringUtils.isEmpty(order) && order.equalsIgnoreCase("DESC"))
criteriaQuery.orderBy(criteriaBuilder.desc(employeeRoot
.get(sort)));
else
criteriaQuery
.orderBy(criteriaBuilder.asc(employeeRoot .get(sort)));
}
criteriaQuery.where(criteriaBuilder.and(criteriaList.toArray(new Predicate[0])));
final TypedQuery<Employee> query = entityManager
.createQuery(criteriaQuery);
query.setFirstResult(fromValue);
query.setMaxResults(pSize);
return query.getResultList();
}