1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Ordenação e filtro com Lazy Datatable do Primefaces não funciona.

Estou usando uma Datatable do primefaces com recurso lazy para carregar uma lista de dados muito grande. Quando tento filtrar e ou ordenar um campo de outro objeto ele não funciona, se for um campo do mesmo objeto ele funciona.

O objeto principal da tabela é a classe Csr, estou tentando ordenar pelo atributo nome do objeto colaboradorCsr que está dentro dela.

Xhtml

<h:form>
            <p:dataTable id="csrTable" var="csr" value="#{csrBean.model}"
                paginator="true" rows="10" lazy="true"
                paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
                rowsPerPageTemplate="10,50" selectionMode="single"
                selection="#{csrBean.csr}" widgetVar="csrTableV">

                <p:ajax event="rowSelect" listener="#{csrBean.onRowSelect}"
                    update="@form" oncomplete="PF('csrDialog').show()" />

                <p:column headerText="ID">
                    <h:outputText value="#{csr.id}" />
                </p:column>

                <p:column headerText="numero">
                    <h:outputText value="#{csr.numero}" />
                </p:column>

                <p:column headerText="Nome" sortBy="#{csr.colaboradorCsr.nome}"
                    filterBy="#{csr.colaboradorCsr.nome}">
                    <f:facet name="filter">
                        <p:selectCheckboxMenu label="Colaboradores"
                            onchange="PF('csrTableV').filter()" panelStyle="width:250px"
                            scrollHeight="150" filter="true" filterMatchMode="startsWith">
                            <f:selectItems value="#{csrBean.colaboradoresCsr}" />
                        </p:selectCheckboxMenu>
                    </f:facet>
                    <h:outputText value="#{csr.colaboradorCsr.nome}" />
                </p:column>
              </p:dataTable>
</h:form>

Meu CSR Bean

@SuppressWarnings("serial")
@Named
@ViewScoped
public class CsrBean implements Serializable {

    private Csr csrSelecionado;
    @Inject
    private CsrDao dao;

    @Inject
    private ColaboradorCsrDao cDao;
    private List<ColaboradorCsr> colaboradoresCsr;

    private Csr csr;

    private FiltroCsr filtro = new FiltroCsr();
    private LazyDataModel<Csr> model;

    @PostConstruct
    public void init(){
        //Alimenta os filtros
        colaboradoresCsr = cDao.listaTodos();

        model = new LazyDataModel<Csr>(){

            private List<Csr> csrs;

            @Override
            public List<Csr> load(int first, int pageSize, String sortField,
                    SortOrder sortOrder, Map<String, Object> filters) {

                filtro.setPrimeiroRegistro(first);
                filtro.setQuantidadeRegistros(pageSize);
                filtro.setAscendente(SortOrder.ASCENDING.equals(sortOrder));
                filtro.setPropriedadeOrdenacao(sortField);

                setRowCount(dao.quantidadeFiltrados(filtro));

                this.csrs = dao.filtrados(filtro);

                return csrs;
            }

            @Override
            public Object getRowKey(Csr csr) {
                return csr.getId();
            }

            @Override
            public Csr getRowData(String csrId) {
                System.out.println(csrId);
                Integer id = Integer.valueOf(csrId);

                for (Csr csr : csrs) {
                    System.out.println("For");
                    if(csr.getId().equals(id)){
                        csr = dao.buscaId(id);
                        return csr;
                    }
                }
                return null;
            }
        };
    }

    //Getters and setters

}

FiltroCsr

public class FiltroCsr implements Serializable{

    private static final long serialVersionUID = 1L;

    private List<ColaboradorCsr> colaboradoresCsr;

    private int primeiroRegistro;
    private int quantidadeRegistros;
    private String propriedadeOrdenacao;
    private boolean ascendente;

    //Getters and setters

}

CsrDAO

@RequestScoped
public class CsrDao {
    @Inject
    private EntityManager manager;

    @SuppressWarnings("unchecked")
    public List<Csr> filtrados(FiltroCsr filtro){
        Criteria criteria = criaCriteriaParaFiltro(filtro);

        criteria.setFirstResult(filtro.getPrimeiroRegistro());
        criteria.setMaxResults(filtro.getQuantidadeRegistros());

        if(filtro.isAscendente() && filtro.getPropriedadeOrdenacao() != null){
            criteria.addOrder(Order.asc(filtro.getPropriedadeOrdenacao()));
        }else if(filtro.getPropriedadeOrdenacao() != null){
            criteria.addOrder(Order.desc(filtro.getPropriedadeOrdenacao()));
        }

        return criteria.list();
    }

    public int quantidadeFiltrados(FiltroCsr filtro){
        Criteria criteria = criaCriteriaParaFiltro(filtro);

        criteria.setProjection(Projections.rowCount());

        return ((Number)criteria.uniqueResult()).intValue();
    }

    private Criteria criaCriteriaParaFiltro(FiltroCsr filtro) {
        Session session = manager.unwrap(Session.class);
        Criteria criteria = session.createCriteria(Csr.class);

        //Aqui adicione os filtros usando o criteria do hibernate

        if(filtro.getColaboradoresCsr() != null){
            criteria.add(Restrictions.ilike("colaboradorCsr.nome", filtro.getColaboradoresCsr()));
        }

        return criteria;
    }


}
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags jsf lazy primefaces hibernate ou faça a sua própria pergunta.