Primefaces DataTable + JPA / Hibernate Pagination - PullRequest
5 голосов
/ 05 апреля 2011

Было бы так здорово, если бы я мог как-то объединить обе эти структуры вместе в нумерации страниц.

Нажатие кнопки «Далее» или «Предыдущая» в Primefaces Datatable вызовет запрос, ограничив результат запроса с помощью JPA.

Также, возможно, с помощью какого-либо механизма, компонент primefaces также может получить общее количество страниц из другого запроса на выборку JPA?

Есть ли какой-нибудь пример того, как применить их в работе?

Пожалуйста, поделитесь своим опытом по этому вопросу.

Спасибо!

Ответы [ 2 ]

11 голосов
/ 07 апреля 2011

Вы можете использовать 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 голосов
/ 21 апреля 2011

Это мой код с фильтром для одного столбца (имя столбца).

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