A classe Produto eu tenho um atributo categoria mapeado com @OneToMany. Na classe Categoria eu tenho um atributo setor mapeado com @ManyToOne. Na classe Setor eu tenho um atributo cdSetor.
Eu preciso fazer dois join, sendo um de Produto para Categoria e um de Categoria para Setor.
Como eu faria para dar certo esse join e filtrar pelo atributo cdSetor? No código abaixo, o que precisaria ser feito para essa consulta funcionar?
Pode me ajudar por favor.
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> 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();
}