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

Solucionado (ver solução)

Busca retornando vazia

Estou com o seguinte codigo de busca de produtos, como mostrado em aula e nos exercicios, porem a busca não retorna nada, esta sempre vazia.

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();

    }
6 respostas

Bom, eu não vi algo errado na construção da criteria... vc pode colar aqui a query que ta sendo gerada? Outro detalhe, que parece besta, mas confere se o seu banco tem registro compatível com o que vc ta buscando.

Então, estou debugando a aplicação e não consigo ver onde a querie está sendo montada pelo criteria. O estranho é que é o banco e o código disponibilizados nos exercícios da aula. Como eu conseguiria ver a query que está sendo gerada?

por favor uma ajuda aqui

Tem uma propriedade chamada, que vc pode configurar no persistence.xml, chamada hibernate.show_sql e hibernate.format_query, se eu não estou enganado. Eh habilitar e ver a query.

certo, obrigado pela resposta. Consegui ver a query e ela realmente não retorna nada. O problema da query é um inner join com categorias, sendo que como comentei em outro problema que tive - https://cursos.alura.com.br/forum/topico-atributo-categorias-29326 -, o atributo categorias não esta sendo gerado no banco pelo hibernate, entao a consulta volta vazia. Sabe porque esse campo não esta sendo gerado ? Obrigado

solução

Andrey, Estava com o mesmo problema, mas achei a solução, o problema era o seguinte:

Na classe de configuração JpaConfigurator( ou no persistence.xml caso tenha optado por ele) tinhamos a propriedade "hibernate.hbm2ddl.auto", "create-drop"

logo, todas as relações entre produto e categoria que fizemos na primeira aula era deletadas ao subir a aplicação, o que eu fiz foi, marca-la como update

"hibernate.hbm2ddl.auto", "update"

E na class CriadorDeProdutos eu comentei o corpo do método init() para evitar de que os dados ja salvos no banco de dados fossem subidos novamente.

Espero ter ajudado