JSF2 + Primefaces : DataTable lazy loading issue

10,912

Your LazyDataModel implementation is not setting rowCount. You should do something like:

public void init(){
    // +getter , setter
    userDataList = new LazyDataModel<UserDetail>(){

        private static final long serialVersionUID = 1L;

        @Override
        public List<UserDetail> load(int first, int pageSize, String sortField,
                SortOrder sortOrder, Map<String, String> filters) {
            userDataList.setRowCount(...);
            return lazyDataModelCom.getResultList(first, pageSize, sortField, sortOrder, filters);
        }
    };
    userDataList.setRowCount(...);
}

Pay attention that rowCount is feeded with the number of rows before pagination but after filtering.

See this answer containing a working example (with the only difference that it uses JPA Criteria API instead of Hibernate Criteria):

Share:
10,912
Jimit Tank
Author by

Jimit Tank

Updated on June 14, 2022

Comments

  • Jimit Tank
    Jimit Tank almost 2 years

    I guess, my java code is proper, but records are not showing on dataTable.

    Please check below code. i dont know where i made mistake.

    .xhtml

     <p:dataTable value="#{userDetailList.userDataList}" var="user" rows="5" 
                                paginator="true" lazy="true" 
                                paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} 
    {CurrentPageReport} {NextPageLink} {LastPageLink}">
    
                            <p:column headerText="No">
                                <h:outputText value="#{user.id}"></h:outputText>
                            </p:column>
    
                            <p:column headerText="User Name">
                                <h:outputText value="#{user.userName}"></h:outputText>
                            </p:column>
    
    
    
                        </p:dataTable>
    

    .java

    @PostConstruct
        public void init(){
            // +getter , setter
            userDataList = new LazyDataModel<UserDetail>(){
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public List<UserDetail> load(int first, int pageSize, String sortField,
                        SortOrder sortOrder, Map<String, String> filters) {
    
                    return lazyDataModelCom.getResultList(first, pageSize, sortField, sortOrder, filters);
                }
            };
        }
    

    getResultList

    public List<UserDetail> getResultList(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
            Session session = HibernateUtils.getsession();
    
            Criteria criteria = session.createCriteria(UserDetail.class);
            criteria.addOrder(Order.asc("id"));
    
            for (Map.Entry<String, String> entry : filters.entrySet()) {
                if (entry.getValue() != null) {
                    criteria.add(Restrictions.ilike("id",
                            "%" + entry.getValue() + "%"));         }
            }
    
            criteria.setMaxResults(pageSize);
            criteria.setFirstResult(first); 
    
            return criteria.list(); 
        }
    

    getResultList method return a proper value, i debug it. i think problem is in userDataList.