Ao analisar o código abaixo, tenho um join na propriedade categorias, mas não preciso disso para a prorpiedade loja. Isso acontece porque? Meu paltipe é que, como a lista de categorias esta mapeada como ManyToMany(ao contrário do mapeamento para propriedade loja, que é ManyToOne), então seu fetch é do tipo Lazy, então tenho que forçar a busca com o join do criteria, que é o mesmo que fazer join fecth na jpql, estou certo?
@Transactional
public List<Produto> getProdutos(String nome, Integer categoriaId, Integer lojaId) {
Session session = em.unwrap(Session.class);
Criteria criteria = session.createCriteria(Produto.class);
if (!nome.isEmpty()) {
criteria.add(Restrictions.like("nome", "%" + nome + "%"));
}
if (lojaId != null) {
criteria.add(Restrictions.like("loja.id", lojaId));
}
if (categoriaId != null) {
criteria.setFetchMode("categorias", FetchMode.JOIN)
.createAlias("categorias", "c")
.add(Restrictions.like("c.id", categoriaId));
}
return (List<Produto>) criteria.list();
}