JPA - Pagination Searching and sorting

The following code can be used for the following requirements

1.) To retrieve limited records to support pagination
2.) To support pagination searching & sorting

        public List<Employee> listEmployee(int fromValue, int pSize,
                        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();
}


public class Employee{
  private int id;
  private String name;
  private int age;
  private long salary;
  private String status;

}

Technology: 

Search