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

Não renderiza os livros na página após pesquisa

Resolvi criar um tópico de mesmo nome a esse porque o meu erro é exatamente o mesmo.

O pior é que eu fui começar a sessão "mãos na massa" e descobri que não tinha o que fazer. Baixei o projeto inicial, como pedido no começo do curso, e a parte referente a Atividade 8 - Aula 3, já estava feita para mim :facepalm:

Segue o código, de qualquer forma:

ProdutoDao.java

public List<Produto> getProdutos(String nome, Integer categoriaId, Integer lojaId) {
        CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
        CriteriaQuery<Produto> query = criteriaBuilder.createQuery(Produto.class);
        Root<Produto> root = query.from(Produto.class);

        Path<String> nomePath = root.<String> get("nome");
        Path<Integer> lojaPath = root.<Loja> get("loja").<Integer> get("id");
        Path<Integer> categoriaPath = root.join("categorias").<Integer> get("id");

        List<Predicate> predicates = new ArrayList<>();

        if (!nome.isEmpty()) {
            Predicate nomeIgual = criteriaBuilder.like(nomePath, nome);
            predicates.add(nomeIgual);
        }
        if (categoriaId != null) {
            Predicate categoriaIgual = criteriaBuilder.equal(categoriaPath, categoriaId);
            predicates.add(categoriaIgual);
        }
        if (lojaId != null) {
            Predicate lojaIgual = criteriaBuilder.equal(lojaPath, lojaId);
            predicates.add(lojaIgual);
        }

        query.where((Predicate[]) predicates.toArray(new Predicate[0]));

        TypedQuery<Produto> typedQuery = em.createQuery(query);
        return typedQuery.getResultList();

    }

Assim como comentado no tópico citado, fiz o debug point na linha do método e a saída do console do eclipse foi:

Hibernate: select produto0_.id as id1_2_, produto0_.descricao as descrica2_2_, produto0_.linkDaFoto as linkDaFo3_2_, produto0_.loja_id as loja_id6_2_, produto0_.nome as nome4_2_, produto0_.preco as preco5_2_ from Produto produto0_ inner join Produto_Categoria categorias1_ on produto0_.id=categorias1_.Produto_id inner join Categoria categoria2_ on categorias1_.categorias_id=categoria2_.id where categoria2_.id=1
7 respostas

Quando você roda em modo debug, a linha "typedQuery.getResultList();" retorna algum valor do banco de dados?

Na perspectiva de debug, pareceu isso pra mim na parte das variáveis:

typedQuery    $Proxy46  (id=325)    

E uma porção de outras coisas que não sei se consigo ler direito como fazer o debug a partir das informações =/

Dei uma olhada nas views, pra ver se tem algo errado lá e não me pareceu. Porém tudo é acessado, usando o expression language, utilizando {loja.id}, {categoria.id}. Fiquei um pouco em dúvida se a falta de um parâmetro sendo passado na requisição com o nome lojaId ou categoriaId esteja atrapalhando o controller que faz o @RequestParam deles nesse formato

Fala Vini,

Percebi que no seu Predicate do nome ficou faltando os "%", tenta deixar assim pra ver se resolve:

Predicate nomeIgual = criteriaBuilder.like(nomePath, "%" + nome + "%");

Ainda não, continua a mesma coisa =/ Não importa se eu busco por loja, por categoria, por nome ou uma combinação entre eles, nada aparece na tela pra mim

ProdutoDao.java

public List<Produto> getProdutos(String nome, Integer categoriaId, Integer lojaId) {
        CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
        CriteriaQuery<Produto> query = criteriaBuilder.createQuery(Produto.class);
        Root<Produto> root = query.from(Produto.class);

        Path<String> nomePath = root.<String> get("nome");
        Path<Integer> lojaPath = root.<Loja> get("loja").<Integer> get("id");
        Path<Integer> categoriaPath = root.join("categorias").<Integer> get("id");

        List<Predicate> predicates = new ArrayList<>();

        if (!nome.isEmpty()) {
          Predicate nomeIgual = criteriaBuilder.like(nomePath, "%" + nome + "%");
            predicates.add(nomeIgual);
        }
        if (categoriaId != null) {
            Predicate categoriaIgual = criteriaBuilder.equal(categoriaPath, categoriaId);
            predicates.add(categoriaIgual);
        }
        if (lojaId != null) {
            Predicate lojaIgual = criteriaBuilder.equal(lojaPath, lojaId);
            predicates.add(lojaIgual);
        }

        query.where((Predicate[]) predicates.toArray(new Predicate[0]));

        TypedQuery<Produto> typedQuery = em.createQuery(query);
        return typedQuery.getResultList();

    }

Rapaz, esse último código que você mandou me parece que está correto, ainda tem registros de Produto no banco de dados?

Puts hahahah Tem tudo sim, man. Eu acabei não avisando, mas tô usando o Tomcat 9, que já estava configurado no meu eclipse. No projeto pede a v8, será que isso tá gerando algum conflito?

Eu vou fazer o seguinte: vou apagar o projeto, vou importar de novo e tentar com o Tomcat 8 e aí posto o que deu.

solução!

Otávio, finalmente descobri o problema! Ufa!

Depois que você comentou sobre os registros de Produto no BD, fiquei meio intrigado. Aí, antes de apagar tudo e tentar com o Tomcat 8, fui dar uma investigada.

Sempre que o server é iniciado, ele faz drop tables e injeta tudo de novo. Eu estava vendo essa saída no console, por isso eu estava crente que estava tudo certo.

Foi quando eu fui dar uma olhada nas configurações do JPA no pacote br.com.caelum e pareceu estar tudo certo. Então dei uma olhada no CriadorDeProdutos.java e encontrei o problema:

// cursoDeViolao.adicionarCategorias(tecnologia, musica);

Todas as linhas com .adicionarCategorias() estavam comentadas. Aí chequei no BD e realmente, a tabela de Categorias estava vazia, enquanto a de Produtos e Loja estavam preenchidas. Descomentei e percebi que o próprio método estava comentado na classe Produto.java. Depois que descomentei o método, reiniciei o Tomcat e tudo está funcionando normalmente agora.

Eu não sei se esse método será tópico de alguma aula posterior, mas ficou bem estranho ele estar comentado agora e eu não conseguir visualizar a mesma coisa que no vídeo. Mesmo se for, talvez fosse melhor dar uma arrumada nos arquivos que a galera vai baixar ou verificar a ordem das aulas no curso, não sei.