Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

sortBy parou de funcionar

Depois de implementar esse Lazy o sortBy do primefaces parou de funcionar.

4 respostas

Oi Eduardo, tudo bem?

você poderia passar o seu código para dar uma olhada?

Obrigado!

Segue o código do livro.xhtml

        <h:form id="formTabelaLivros">
            <p:dataTable id="tabelaLivros" value="#{livroBean.livroDataModel}" rows="5" paginator="true" lazy="true"
                var="livro" widgetVar="tabelaLivros">
                <f:facet name="header">Livros</f:facet>
                <p:column headerText="Título" sortBy="#{livro.titulo}" filterBy="#{livro.titulo}" filterMatchMode="startsWith">
                    <h:outputText value="#{livro.titulo}" />
                </p:column>

                <p:column headerText="Gênero" sortBy="#{livro.genero}"
                    filterBy="#{livro.genero}" filterMatchMode="startsWith">
                    <f:facet name="filter">
                        <p:selectOneMenu onchange="PF('tabelaLivros').filter()">
                            <f:selectItem itemLabel="Selecione..." itemValue="#{null}"
                                noSelectionOption="true" />
                            <f:selectItems value="#{livroBean.generos}" />
                        </p:selectOneMenu>
                    </f:facet>
                    <h:outputText value="#{livro.genero}" />
                </p:column>

                <p:column headerText="ISBN" sortBy="#{livro.isbn}" filterBy="#{livro.isbn}" filterMatchMode="contains">
                    <h:outputText value="#{livro.isbn}" />
                </p:column>

                <p:column headerText="Preço" sortBy="#{livro.preco}">
                    <h:outputText value="#{livro.preco}" />
                </p:column>

                <p:column headerText="Data" sortBy="#{livro.dataLancamento.time}" filterBy="#{livro.dataLancamento}" filterMatchMode="contains">
                    <h:outputText value="#{livro.dataLancamento.time}">
                        <f:convertDateTime pattern="dd/MM/yyyy HH:mm"
                            timeZone="America/Sao_Paulo" />
                    </h:outputText>
                </p:column>

                <p:column headerText="Atualizar" >
                    <h:commandLink value="atualizar"
                        action="#{livroBean.carregar(livro)}" />
                </p:column>

                <p:column headerText="Remover">
                    <h:commandLink value="remover" action="#{livroBean.remover(livro)}" />
                </p:column>
            </p:dataTable>
        </h:form>
solução!

Fala Eduardo!

o seu método load deve ficar assim:

public List<Livro> load(int inicio, int quantidade, String campoOrdenacao, SortOrder sentidoOrdenacao,
            Map<String, Object> filtros) {
        String titulo = (String) filtros.get("titulo");

        List<Livro> data = dao.listaTodosPaginada(inicio, quantidade, "titulo", titulo);

        // sort
        if (campoOrdenacao != null) {
            Collections.sort(data, new LazySorter(campoOrdenacao, sentidoOrdenacao));
        }

        return data;
    }

e precisaria criar a classe LazySorter que ficaria assim:

public class LazySorter implements Comparator<Livro> {

    private String sortField;

    private SortOrder sortOrder;

    public LazySorter(String sortField, SortOrder sortOrder) {
        this.sortField = sortField;
        this.sortOrder = sortOrder;
    }

    public int compare(Livro livro1, Livro livro2) {
        try {
            Field field = Livro.class.getDeclaredField(this.sortField);
            field.setAccessible(true);
            Object value1 = field.get(livro1);
            Object value2 = field.get(livro2);
            field.setAccessible(false);
            int value = ((Comparable) value1).compareTo(value2);

            return SortOrder.ASCENDING.equals(sortOrder) ? value : -1 * value;
        } catch (Exception e) {
            throw new RuntimeException();
        }
    }
}

no showcase do primefaces é possível ver outros códigos desse tipo:

https://www.primefaces.org/showcase/ui/data/datatable/lazy.xhtml

Espero ter ajudado =)

Samir Bravo,

Funcionou perfeito depois da sua dica!!! apenas seleção por gênero ainda não funcionou