How to implement a LazyDataModel with size in Primefaces

This solution is ideal if you have a list of entities or a named queries that return a list of entities.

For example let's say we have an entity user and we want to return all the users with role=x.
@NamedQueries({ @NamedQuery(name = "User.listUsersByRoles", query = ""
+ "SELECT u FROM User u"
+ " LEFT JOIN u.roles as role"
+ " WHERE IN (:roleNames)) })
public class User implents Serializeable {

Then we need to extend primefaces's LazyDataModel class, overriding the size method.

import org.primefaces.model.LazyDataModel;

public class LazyDataModelWSize extends LazyDataModel {

 private static final long serialVersionUID = -20655217804181429L;

 public Integer size() {
  return getRowCount();
Next we need a service that will call the native query:
public List listUsersByRoleList roleNames) {
 List users = null;

 try {
  users = entityManager.createNamedQuery("User.listUsersByRoles").setParameter("roleNames", roleNames).getResultList();
 } catch (Exception e) {
  log.error("null {}", e.getMessage());

 return users;
And finally a bean that will call the service. Let's say we want to query all the users with role admin and hr.
private LazyDataModel filteredUsers = null; 

public LazyDataModel getFilteredLazyDataModel() { 
 if (filteredUsers != null) {
  return filteredUsers;

 filteredUsers = new LazyDataModelWSize() {
  private static final long serialVersionUID = 1L;

  public List load(int first, int pageSize, String sortField, SortOrder sortOrder, Map loadingFilters) {

   List entities = null;
   entities = userService.listUsersByRoles(Arrays.asList("ADMIN", "HR"));

   return entities.subList(first, (first + pageSize) > entities.size() ? entities.size() : (first + pageSize));

 return filteredUsers;
How to implement a LazyDataModel with size in Primefaces How to implement a LazyDataModel with size in Primefaces Reviewed by Edward Legaspi on Sunday, January 15, 2017 Rating: 5

No comments:

Powered by Blogger.