2011-04-05 40 views
5

Será genial si de alguna manera puedo combinar ambos frameworks juntos en la paginación.Primefaces DataTable + JPA/Hibernate Pagination

Al hacer clic en el botón siguiente o anterior en Primefaces Datatable se activará la consulta, lo que limita el resultado de la consulta mediante JPA.

¿También quizás con algún mecanismo, el componente de las primaras también puede obtener el total de páginas de otra consulta de conteo de selección JPA?

¿Hay algún ejemplo sobre cómo poner esto en funcionamiento?

Por favor, comparta sus experiencias en este.

¡Gracias!

+0

¿Probaste la característica de carga diferida de tabla de datos primefaces? –

Respuesta

11

Puede usar un LazyDataModel. En esta muestra que estoy usando BackBean y JpaController creado por Netbeans con "Crear páginas JSF CRUD de Entidades" (BackBean debe @SessionScoped)

private LazyDataModel<Car> lazyModel; 
private int pageSize = 5; 

public void setPageSize(int pageSize) { 
    this.pageSize = pageSize; 
} 

public int getPageSize() { 
    return pageSize; 

public void LoadData() { 
    lazyModel = new LazyDataModel<Car>() { 

     @Override 
     public List<Car> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) { 

      //Sorting and Filtering information are not used for demo purposes just random dummy data is returned 

      List<Car> result = new ArrayList<Car>(); 

      try { 
       result = getJpaController().findCarEntities(pageSize, first); 
      } catch (Exception ex) { 
       JsfUtil.addErrorMessage(ex, search); 
      } 

      return result; 
     } 
    }; 

    /** 
    * In a real application, this number should be resolved by a projection query 
    */ 
    lazyModel.setRowCount(getJpaController().getCarCount()); 
    lazyModel.setPageSize(pageSize); 
} 

public LazyDataModel<Car> getLazyModel() { 
    return lazyModel; 
} 

He añadido

lazyModel.setPageSize(pageSize); 

por culpa de la división 0 por saber tema http://code.google.com/p/primefaces/issues/detail?id=1544

 <p:dataTable var="item" value="#{controller.lazyModel}" 
         rows="#{controller.pageSize}" paginator="true" 
         paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
         rowsPerPageTemplate="9,12,15" 
         page="" 
         lazy="true" 
         dynamic="true" 
         id="pnlResult" 
         > 
+3

También puede funcionar con @ViewScoped. – ChuongPham

3

Este es mi código con filtro para una columna (columna de nombre).

// @PostConstruct method(injection for ejb's happens after constructor) 
    contactsEJB.getEntityManager().getEntityManagerFactory().getCache().evictAll(); //Clear the cache(get fresh data)  

    lazyModel = new LazyDataModel<Contacts>() { 

     @Override 
     public List<Contacts> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filter) { 

      List<Contacts> list = new ArrayList<Contacts>(); 

      if (!filter.isEmpty()) { 
       Iterator it = filter.entrySet().iterator(); 
       it.hasNext(); //this needs to be a while loop to handle multiple filter columns 
       Map.Entry pairs = (Map.Entry) it.next(); 
       list = contactsEJB.findNameLike(pairs.getValue().toString(), first, pageSize); 
       getLazyModel().setRowCount(list.size()); 
      } else {     
       list = contactsEJB.findRangeOrder(first, pageSize);     
       getLazyModel().setRowCount(contactsEJB.count()); 
      } 

      return list; 
     } 
    }; 

    getLazyModel().setRowCount(contactsEJB.count()); 

EJB

public List<Contacts> findRangeOrder(int start, int max) { 

    CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
    CriteriaBuilder builder = getEntityManager().getCriteriaBuilder(); 
    Root<Contacts> root = cq.from(Contacts.class);   
    cq.select(root); 
    cq.orderBy(builder.desc(root.get(Contacts_.inserted))); 
    Query query = getEntityManager().createQuery(cq); 
    query.setMaxResults(max); 
    query.setFirstResult(start); 
    return query.getResultList(); 
} 

    public List<Contacts> findNameLike(String name, int start, int max) { 

    CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
    CriteriaBuilder builder = getEntityManager().getCriteriaBuilder(); 
    Root<Contacts> root = cq.from(Contacts.class);   
    cq.select(root);   
    Predicate likeName = builder.like(root.get(Contacts_.name), "%"+name+"%");   
    cq.where(likeName);   
    Query query = getEntityManager().createQuery(cq); 
    query.setMaxResults(max); 
    query.setFirstResult(start); 
    return query.getResultList(); 
}