Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

sortedBy com Lazy

Após implementar o LazyDataModel as colunas de ordenação não funcionam.

livro.xhtml

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

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

                <p:column headerText="Valor" filterBy="#{livro.preco}" filterFunction="#{livroBean.precoEhMenor}">
                    <h:outputText value="#{livro.preco}">
                        <f:convertNumber type="currency" pattern="R$ #0.00"
                            currencySymbol="R$" locale="pt_BR" />
                    </h:outputText>
                </p:column>

                <p:column headerText="Lançamento">
                    <h:outputText value="#{livro.dataLancamento.time}">
                        <f:convertDateTime pattern="dd/MM/yyyy" />
                    </h:outputText>
                </p:column>

                <p:column headerText="Alterar">
                    <p:commandLink styleClass="ui-icon ui-icon-pencil" style="float:left;margin-right:10px"
                            process="@this" update=":formLivro">
                        <f:setPropertyActionListener value="#{livro}" target="#{livroBean.livro}"/>
                    </p:commandLink>
                </p:column>

                <p:column headerText="Excluir">
                    <p:commandButton action="#{livroBean.removeLivro(livro)}" 
                        icon="fa fa-fw fa-remove" process="@this" update="tabelaLivros"/>
                </p:column>
            </p:dataTable>
        </h:form>

LivroDataModel

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

DAO

    public List<T> listaTodosPaginada(int firstResult, int maxResults, String coluna, String valor) {
        EntityManager em = new JPAUtil().getEntityManager();
        CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
        Root<T> root = query.from(classe);

        if(valor != null)
            query = query.where(em.getCriteriaBuilder().like(root.<String>get(coluna), valor + "%"));

        List<T> lista = em.createQuery(query).setFirstResult(firstResult).setMaxResults(maxResults).getResultList();

        em.close();
        return lista;
    }

Obrigado.

1 resposta
solução!

Galera, resolvi com o código abaixo, esta correto ou é a famosa gambiarra...rsrsrs

DAO, método listaTodosPaginada

    public List<T> listaTodosPaginada(int firstResult, int maxResults, String coluna, String valor, 
            String campoOrdenacao, SortOrder sentidoOrdenacao) {

        EntityManager em = new JPAUtil().getEntityManager();
        CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
        Root<T> root = query.from(classe);

        //Valor do campo de busca diferente de nulo
        if(valor != null){
            query = query.where(em.getCriteriaBuilder().like(root.<String>get(coluna), valor + "%"));
        }else if(campoOrdenacao != null){ // campo ordenação selecionado
            if(SortOrder.ASCENDING.equals(sentidoOrdenacao)){
                query = query.orderBy(em.getCriteriaBuilder().asc(root.<String>get(campoOrdenacao)));
            }
            if(SortOrder.DESCENDING.equals(sentidoOrdenacao)){
                query = query.orderBy(em.getCriteriaBuilder().desc(root.<String>get(campoOrdenacao)));
            }
        }
        List<T> lista = em.createQuery(query).setFirstResult(firstResult).setMaxResults(maxResults).getResultList();

        em.close();
        return lista;
    }

No meu LazyDataModel enviei todos os valores recibo pelo JSF para o DAO

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

        livros = dao.listaTodosPaginada(inicio, quantidade, "titulo", titulo, campoOrdenacao, sentidoOrdenacao);
        return livros;
    }