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?