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