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

o que cada linha faz ?

estou com bastante duvida sobr o que cada uma dessas linhas realmente faz, ja vi o s videos varias vezes e não entendi direito. algem sabe outra explicação um pouco mais clara?

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> categoriaPath = root.join("categorias").<Integer> get("id");
        Path<Integer> lojaPath = root.<Loja> get("loja").<Integer> get("id");

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

        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();
1 resposta
solução!
//cria o objeto responsável por montar uma query
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();

//informa quem vai ser a classe que define o tipo de retorno //da consulta.
        CriteriaQuery<Produto> query = criteriaBuilder
                .createQuery(Produto.class);

//informa quem vai ser a origem da consulta
        Root<Produto> root = query.from(Produto.class);


//Path é a representação um atributo do objeto. Com o path
//em maos, você pode adicionar condições na consulta.
        Path<String> nomePath = root.<String> get("nome");
        Path<Integer> categoriaPath = root.join("categorias").<Integer> get("id");
        Path<Integer> lojaPath = root.<Loja> get("loja").<Integer> get("id");

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

        if (!nome.isEmpty()) {
//ex: aqui, através do builder, ele adiciona um like na //consulta.
            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);
        }

//depois de criado os filtros, é necessário aplicar... É para isso //que serve o método where
        query.where((Predicate[]) predicates.toArray(new Predicate[0]));

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

        return typedQuery.getResultList();

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software