sortBy e filterBy com PrimeFaces 3.0

12 respostas
C
Olá amigos, estou com problemas para fazer o sortBy e o filterBy da p:dataTable funcionarem. Estou usando páginação por demanda. Eles simplesmente nao fazem nenhuma ação. Alguém tem alguma idéia do que posso estar fazendo de errado? XHTML:
<p:dataTable id="dtCarreta" value="#{carretaMBean.lazyModel}" lazy="true" var="item" paginator="true" rows="5"
                             emptyMessage="#{msgs.dtVazia}" rowsPerPageTemplate="5,10,15" selection="#{carretaMBean.selectedCarretas}"
                              rowStyleClass="#{empty rowIx or rowIx mod 2 ne 0 ? 'even-row' : 'odd-row'}"
                             rowIndexVar="rowIx" rowKey="#{item.codigocarreta}">

                    <f:facet name="header">
                        <p:commandButton id="cbtGravar" value="#{msgs.cbtGravar}" update="frmCadastrarCarreta:pgSalvar"
                                         oncomplete="multiCarDialog.show()" image="ui-icon-disk">
                            <f:setPropertyActionListener value="#{true}" target="#{carretaMBean.cbtAlterar}" />
                            <f:setPropertyActionListener value="#{false}" target="#{carretaMBean.cbtSalvar}" />
                            <f:setPropertyActionListener value="#{false}" target="#{carretaMBean.cbtLimpar}" />
                            <f:setPropertyActionListener value="#{false}" target="#{carretaMBean.dSalvar}" />
                        </p:commandButton>

                        <p:commandButton id="cbtEditar" value="#{msgs.cbtAlterar}"
                                         update="frmCadastrarCarreta:pgSalvar, frmCadastrarCarreta:msgs"
                                         oncomplete="editar(xhr, status, args)"
                                         image="ui-icon-disk"
                                         action="#{carretaMBean.editar}">
                            <f:setPropertyActionListener value="#{false}" target="#{carretaMBean.cbtAlterar}" />
                            <f:setPropertyActionListener value="#{true}" target="#{carretaMBean.cbtSalvar}" />
                            <f:setPropertyActionListener value="#{true}" target="#{carretaMBean.cbtLimpar}" />
                            <f:setPropertyActionListener value="#{false}" target="#{carretaMBean.dSalvar}" />
                        </p:commandButton>

                        <p:commandButton id="btnExcluirCarreta" value="#{msgs.cbtExcluirCarreta}"
                                         image="ui-icon ui-icon-close" oncomplete="excluir(xhr, status, args)"
                                         action="#{carretaMBean.excluir}" update="frmCadastrarCarreta:msgs">
                            <f:setPropertyActionListener value="#{item}" target="#{carretaMBean.selectedCarreta}" />
                            <f:setPropertyActionListener value="#{true}" target="#{carretaMBean.dSalvar}" />
                        </p:commandButton>
                    </f:facet>

                    <p:column selectionMode="multiple" />
                    <p:column id="clnCodCarreta" style="width: 50px" sortBy="#{item.codigocarreta}" filterBy="#{item.codigocarreta}">
                        <f:facet name="header">
                            <h:outputText id="optCodigoCarreta" value="#{msgs.optTableCodigoCarreta}" />
                        </f:facet>
                        <h:outputText value="#{item.codigocarreta}"/>
                    </p:column>
                    <p:column id="clnDescricaoCarreta" sortBy="#{item.descricao}" filterBy="#{item.descricao}">
                        <f:facet name="header">
                            <h:outputText id="optDescricaoCarreta" value="#{msgs.optTableDescricaoCarreta}" />
                        </f:facet>
                        <h:outputText value="#{item.descricao}"/>
                    </p:column>
                    <p:column id="clnPlaca" sortBy="#{item.placa}" filterBy="#{item.placa}">
                        <f:facet name="header">
                            <h:outputText value="#{msgs.optTablePlacaCarreta}" />
                        </f:facet>
                        <h:outputText value="#{item.placa}"/>
                    </p:column>
                    <p:column id="clnAno" sortBy="#{item.ano}" filterBy="#{item.ano}">
                        <f:facet name="header">
                            <h:outputText value="#{msgs.optTableAnoCarreta}" />
                        </f:facet>
                        <h:outputText value="#{item.ano}"/>
                    </p:column>
                    <p:column id="clnCor" sortBy="#{item.cor}" filterBy="#{item.cor}">
                        <f:facet name="header">
                            <h:outputText value="#{msgs.optTableCorCarreta}" />
                        </f:facet>
                        <h:outputText value="#{item.cor}"/>
                    </p:column>
                    <p:column id="clnCarroceira" sortBy="#{item.carroceria.descricao}"
                              filterBy="#{item.carroceria.descricao}">
                        <f:facet name="header">
                            <h:outputText value="#{msgs.optTableCarroceriaCarreta}" />
                        </f:facet>
                        <h:outputText value="#{item.carroceria.descricao}"/>
                    </p:column>

                    <f:facet name="footer">
                        <h:outputText value="#{msgs.contaRegistros} #{carretaMBean.lazyModel.rowCount}"/>
                    </f:facet>
                </p:dataTable>
Bean:
private void init() {

		lazyModel = new LazyDataModel<Carreta>() {

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

				final List<Carreta> toReturn = carretaService.getListaPaginado(first, pageSize);

				if (ehParaContar) {
					rowCount = carretaService.count();
					lazyModel.setRowCount(rowCount);
					ehParaContar = false;
				}
				return toReturn;
			}
		};

		rowCount = carretaService.count();
		lazyModel.setRowCount(rowCount);
	}
DAO:
public List<Carreta> getListaPaginado(int inicio, int quantidade) {
        Session ses = getSession();
        Query query = ses.createQuery("SELECT e FROM Carreta e").setFirstResult(inicio).setMaxResults(quantidade);

        List<Carreta> lista = (List<Carreta>) query.list();
        return lista;
    }

12 Respostas

F

Na sua query você não teria que adicionar o sortOrder?

Estou com um problema parecido, só que com o filtro por string. Estou usando Criteria para fazer a query, segue o link que eu estou usando de exemplo:

C

Nao sei, mas no meu caso como ficaria?

C

No exemplo que vc passou o sortOrder no DAO é um boolean, e lá no bean ele é um SortOrder que extende de uma classe do PrimeFaces 3, como faço pra resolver isso?

F

Esse SortOrder é um enum, é so você fazer uma comparação do tipo:

sortOrder == SortOrder.ASCENDING ? true : false
C

Resolvi da seguinte forma, lá no DAO:

if (sortField != null && !sortField.isEmpty()) { if (sortOrder == SortOrder.ASCENDING) { crit = crit.addOrder(Order.asc(sortField)); } else { crit = crit.addOrder(Order.desc(sortField)); } }

Mas ai na tabela os dados vem do maior para o menor, e eu queria ao contrário. Já tentei de várias formas e eu nao dá. Tem alguma ideia?

F

Tem que ver se ele esta entrando no else, debuga e ver qual o valor do sortOrder esta chegando ali.

C

E o filterBy, vc conseguiu resolver ?

F

Usando Criteria ainda não =/

C

Mas e de outra forma sim?

C

A hora que voce conseguir fazer funcionar de qualquer forma, por favor, me avise…

F
Então cara, resolvi usar por Criteria mesmo, segue a minha classe abstract:
public List<T> lazyLoadList(int index, int count, String sortField, boolean sortOrder, Map<String, String> filters){
		Criteria criteria = getSession().createCriteria(persistentClass);		
		if (sortField != null && !sortField.isEmpty()) {
			if (sortOrder) {
				criteria.addOrder(Order.asc(sortField));
			} else {
				criteria.addOrder(Order.desc(sortField));
			}
		}

		if (!filters.isEmpty()) {
			Iterator<Entry<String, String>> iterator = filters.entrySet().iterator();
			while (iterator.hasNext()) {
				Entry<String, String> entry = iterator.next();
				criteria.add(Restrictions.ilike(entry.getKey(), entry.getValue(), MatchMode.ANYWHERE));
			}
		}
		
		return criteria.setFirstResult(index).setMaxResults(count).list();
	}
E para pegar o número para paginação:
public Long getCountLazyList(int index, int count, Map<String, String> filters){
    	Criteria criteria = getSession().createCriteria(persistentClass);		
		
		if (!filters.isEmpty()) {
			Iterator<Entry<String, String>> iterator = filters.entrySet().iterator();
			while (iterator.hasNext()) {
				Entry<String, String> entry = iterator.next();
				criteria.add(Restrictions.ilike(entry.getKey(), entry.getValue(), MatchMode.ANYWHERE));
			}
		}
		criteria.setProjection(Projections.rowCount());
		
		return (Long)criteria.list().get(0);
    }
Se vc não conseguir resolver assim, tente por Hql mesmo, segue o link: http://forum.primefaces.org/viewtopic.php?f=3&t=5043&p=22129&hilit=lazy+load+and+filter&sid=b799a6d0bebdba35abdaff4b142a59ee#p22129
C
Cara parece que vai até no DAO mas nao renderiza a página. Aquela classe Entry é importada do java.util.Map.Entry certo? No bean nao muda nada? O meu ta assim:
public List<Carreta> load(final int index, final int count, final String sortField, final SortOrder sortOrder,
					final Map<String, String> filters) {

				final List<Carreta> toReturn = carretaService.getListaPaginado(index, count, sortField, sortOrder, filters);

				if (ehParaContar) {
					rowCount = carretaService.count();
					lazyModel.setRowCount(rowCount);
					ehParaContar = false;
				}
				return toReturn;
			}
		};

		rowCount = carretaService.count();
		lazyModel.setRowCount(rowCount);
}

E outra coisa, aquele método que você falou que é para pegar o número para paginação não influencia em nada para fazer o filtro funcionar?

Criado 24 de janeiro de 2012
Ultima resposta 26 de jan. de 2012
Respostas 12
Participantes 2