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 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;
}

0 nhận xét:

Đăng nhận xét