2011-04-05 20 views
5

यह बहुत अच्छा होगा अगर मैं इन दोनों ढांचे को एक साथ जोड़कर जोड़ सकता हूं।प्राइमफेस डेटाटेबल + जेपीए/हाइबरनेट पेजिनेशन

प्राइमफ़ेस डेटाटेबल पर अगले या पिछली बटन पर क्लिक करने से क्वेरी ट्रिगर होगी, जेपीए का उपयोग करके क्वेरी परिणाम सीमित कर देगा।

शायद कुछ तंत्र के साथ, प्राइमफेस घटक अन्य जेपीए चयन गिनती क्वेरी से कुल पृष्ठ भी प्राप्त कर सकता है?

क्या इन्हें काम में रखने के तरीके पर कोई उदाहरण है?

कृपया इस पर अपने अनुभव साझा करें।

धन्यवाद!

+0

आप primeface के datatable के आलसी लोड हो रहा है सुविधा की कोशिश की? –

उत्तर

11

आप एक LazyDataModel का उपयोग कर सकते हैं। इस नमूने मैं BackBean और JpaController "संस्थाओं से JSF CRUD पेज बनाएँ" के साथ Netbeans द्वारा बनाई उपयोग कर रहा हूँ में (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

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(); 
} 
संबंधित मुद्दे