No exemplo das aulas, para efetuar a busca de produtos (ProdutoDao.getProdutos
) utilizamos uma TypedQuery
, a qual utilizamos typedQuery.setHint("org.hibernate.cacheable", "true");
para ativar o cache da query.
Gostaria de saber se é possível e como fazer para ativar o mesmo tipo de cache quando estou utilizando uma CriteriaQuery.
Segue o código de meu método getProdutos usando CriteriaQuery:
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.get("nome");
Path<Integer> lojaPath = root.get("loja").get("id");
Path<Integer> categoriasPath = root.join("categorias").get("id");
List<Predicate> predicates = new ArrayList<>();
if (!nome.isEmpty()) {
Predicate nomeLike = criteriaBuilder.like(nomePath, "%" + nome + "%");
predicates.add(nomeLike);
}
if (categoriaId != null) {
Predicate categoriaEq = criteriaBuilder.equal(categoriasPath, categoriaId);
predicates.add(categoriaEq);
}
if (lojaId != null) {
Predicate lojaEq = criteriaBuilder.equal(lojaPath, lojaId);
predicates.add(lojaEq);
}
query.where((Predicate[]) predicates.toArray(new Predicate[0]));
query.distinct(true);
return em.createQuery(query).getResultList();
}