no

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...

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 role.name 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;

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

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

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

 return filteredUsers;
}

Related

java-jsf 8325605416048816442

Post a Comment Default Comments

item