2
respostas

Aula 3 - Vídeo 2 - Problema com o filtro de nome (predicate com "like")

No vídeo 2 - Montando as consultas dinâmicas - fiz o código da mesma forma que o instrutor, mas quando coloco para rodar ocorre um problema com o filtro de nome. Crio o predicate com método like do Criteria Builder, mas parece que não há um funcionamento adequado pois o filtro só funciona se colocar o nome do livro idêntico ao título do livro. Se colocar uma variação o filtro não retorna nada. Segue abaixo o meu código (com comentários):

@Transactional
public List<Produto> getProdutos(String nome, Integer categoriaId, Integer lojaId) {
        CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); //Construtor do Criteria Query que é buscado a partir do Entity Manager.
        CriteriaQuery<Produto> query = criteriaBuilder.createQuery(Produto.class); //Criação do Criteria Query (query) de produtos a partir do Criteria Builder.
        Root<Produto> root = query.from(Produto.class); //Criação da raiz. A raiz traça o caminho para busca dos atributos da classe Produto (nome, categorias e loja) que serão usados nos filtros.

        Path<String> nomePath = root.<String> get("nome"); //Caminho para o atributo nome da classe Produto.
        Path<Integer> lojaPath = root.<Loja> get("loja").<Integer> get("id"); //Caminho para o atributo loja da classe Produto.
        Path<Integer> categoriaPath = root.join("categorias").<Integer> get("id"); //Caminho para o atributo categorias da classe Produto.

        List<Predicate> predicates = new ArrayList<>(); //Criação da lista de predicates.

        if (!nome.isEmpty()) { //Condicional para aplicação do filtro do nome.
            Predicate nomeIgual = criteriaBuilder.like(nomePath, nome); //Se o nome passado no campo de pesquisa da página for parecido com o nome do produto buscado a partir do caminho é criado um predicate do nome.
            predicates.add(nomeIgual); //O predicate é adicionado na lista de predicates.
        }
        if (categoriaId != null) { //Condicional para aplicação do filtro do categoria.
            Predicate categoriaIgual = criteriaBuilder.equal(categoriaPath, categoriaId); //Se a categoria passada no campo de pesquisa da página for igual a categoria do produto buscada a partir do caminho é criado um predicate da categoria.
            predicates.add(categoriaIgual); //O predicate é adicionado na lista de predicates.
        }
        if (lojaId != null) { //Condicional para aplicação do filtro do loja.
            Predicate lojaIgual = criteriaBuilder.equal(lojaPath, lojaId); //Se a loja passada no campo de pesquisa da página for igual a loja do produto buscada a partir do caminho é criado um predicate da loja.
            predicates.add(lojaIgual); //O predicate é adicionado na lista de predicates.
        }

        query.where((Predicate[]) predicates.toArray(new Predicate[0])); //Os predicates são montados em um Array do tipo predicate e associados com a Criteria Query (query).

        TypedQuery<Produto> typedQuery = em.createQuery(query); //Criação da query do tipo Typed Query a partir do Entity Manager e usando o Criteria Query (query) como parâmetro.
        return typedQuery.getResultList(); //A Typed Query busca a lista de resultados da pesquisa usando o parâmetro de Criteria Query (query) para isso.
    }

A minha versão do Java é a 13, a versão do Eclipse é a mais recente (Junho de 2020) e o Apache é o 9.0.34.

Por favor, alguém poderia ajudar?

2 respostas

Oi Rafael

Testando com Java 8 funciona?

Não testei com Java 8 e confesso que não estou com disposição de ficar trocando de versão de Java.