2011-04-05 77 views
5

如果我能以某种方式将这两个框架结合在一起,那将会非常酷。Primefaces DataTable + JPA/Hibernate分页

单击Primefaces Datatable上的next或prev按钮将触发查询,并使用JPA限制查询结果。

也许有了一些机制,primefaces组件也可以从另一个JPA select count查询中获取总页数?

有没有关于如何将这些工作的例子?

请分享你的经验。

谢谢!

+0

你尝试primeface的DataTable的延迟加载功能? – 2011-04-05 07:44:44

回答

11

您可以使用LazyDataModel。在此示例中,我使用BackBean和JpaController通过NetBeans支持 “创建从实体JSF CRUD页” 创建(BackBean必须@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; 
} 

我添加

lazyModel.setPageSize(pageSize); 

怎么一回事,因为分工由0知道问题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

它也可以使用@ViewScoped。 – ChuongPham 2011-04-18 14:44:07

3

这是我的代码过滤器的一列(名称列)。

// @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(); 
}