Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Buscando dados sob demanda

Galera, estou com dificuldade de pesquisar livros na table por preço e data. Por titulo e isbn funciona bem, alguém poderia me ajudar? Segue o código:

DAO listaTodosPaginada (Modificado por @Gilson Araujo de Souza encontrado aqui no fórum, Post original)

public List<T> listaTodosPaginada(int firstResult, int maxResults, String coluna, Double 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;
    }

LivroDataModel

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


        if (filtros.get("titulo") != null) {
            return dao.listaTodosPaginada(inicio, quantidade, "titulo", titulo, campoOrdenacao, sentidoOrdenacao);
        } else if (filtros.get("isbn") != null) {
            String isbn = (String) filtros.get("isbn");
            return dao.listaTodosPaginada(inicio, quantidade, "isbn", isbn,  campoOrdenacao, sentidoOrdenacao);

        } else if (filtros.get("preco") != null) {
            String preco = (String) filtros.get("preco");
            return dao.listaTodosPaginada(inicio, quantidade, "preco", preco,campoOrdenacao, sentidoOrdenacao);  
        } else if (filtros.get("data") != null) {
            String data = (String) filtros.get("data");
            return dao.listaTodosPaginada(inicio, quantidade, "data", data,  campoOrdenacao, sentidoOrdenacao);
        }
        return dao.listaTodosPaginada(inicio, quantidade, "titulo", titulo,  campoOrdenacao, sentidoOrdenacao);

    }

Erro ao pesquisar por preço

/livro.xhtml
fev 25, 2019 5:52:27 PM com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
GRAVE: Error Rendering View[/livro.xhtml]
java.lang.IllegalArgumentException: Parameter value [250%] did not match expected type [java.lang.Double]

Ao pesquisar por data não da erro nenhum mas não funciona

2 respostas

Oi Guilherme, tudo bem?

java.lang.IllegalArgumentException: Parameter value [250%] did not match expected type [java.lang.Double]

Dá uma olhada no seu livro.xhtml, provavelmente o que está sendo enviado para o método listaTodosPaginada está sendo o valor String "250%" mas deveria ser o valor Double 250.

Então Otávio, não estou conseguindo achar o erro, antes de eu começar a usar dataTable lazy estava funcionando corretamente livro.xhtml

<h:form id="formTabelaLivros">
            <p:dataTable widgetVar="tabelaLivros"  id="tabelaLivros" value="#{livroBean.livroDataModel}"
                var="livro" rows="5" paginator="true"
                paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                rowsPerPageTemplate="5,10,15" lazy="true" >
                <p:column sortBy="#{livro.titulo}" filterBy="#{livro.titulo}"
                    filterMatchMode="contains">
                    <f:facet name="header">Título</f:facet>
                    <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()"
                            styleClass="custom-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 sortBy="#{livro.isbn}" filterBy="#{livro.isbn}"
                    filterMatchMode="contains">
                    <f:facet name="header">ISBN</f:facet>
                    <h:outputText value="#{livro.isbn}" />
                </p:column>

                <p:column sortBy="#{livro.preco}" filterBy="#{livro.preco}"
                    filterMatchMode="startWith"
                    filterFunction="#{livroBean.precoEhMenor}">
                    <f:facet name="header">Preço</f:facet>
                    <h:outputText value="#{livro.preco}" />
                </p:column>

                <p:column sortBy="#{livro.dataLancamento}"
                    filterBy="#{livro.dataLancamento.time}" filterMatchMode="contains">
                    <f:facet name="header">Data</f:facet>
                    <h:outputText value="#{livro.dataLancamento.time}">
                        <f:convertDateTime pattern="dd/MM/yyyy HH:mm" />
                    </h:outputText>
                </p:column>
                <p:column>
                    <p:commandLink value="Remover" action="#{livroBean.deletar(livro)}"
                        update="@form" />
                </p:column>
                <p:column>
                    <p:commandLink value="Editar" action="#{livroBean.editar(livro)}"
                        update=":formLivro" />
                </p:column>
            </p:dataTable>
        </h:form>

livroBean

public boolean precoEhMenor(Object valorColuna, Object filtroDigitado, Locale locale) { // java.util.Locale

        // tirando espaços do filtro
        String textoDigitado = (filtroDigitado == null) ? null : filtroDigitado.toString().trim();

        System.out.println("Filtrando pelo " + textoDigitado + ", Valor do elemento: " + valorColuna);

        // o filtro é nulo ou vazio?
        if (textoDigitado == null || textoDigitado.equals("")) {
            return true;
        }

        // elemento da tabela é nulo?
        if (valorColuna == null) {
            return false;
        }

        try {
            // fazendo o parsing do filtro para converter para Double
            Double precoDigitado = Double.valueOf(textoDigitado);
            Double precoColuna = (Double) valorColuna;

            // comparando os valores, compareTo devolve um valor negativo se o value é menor
            // do que o filtro
            return precoColuna.compareTo(precoDigitado) < 0;

        } catch (NumberFormatException e) {

            // usuario nao digitou um numero
            return false;
        }
    }