O trecho abaixo não evitou a reexecução da query. Porque?
// Usando o Criteria do Hibernate
Session session = em.unwrap(Session.class);
Criteria criteria = session.createCriteria(Produto.class);
if(!nome.isEmpty())
criteria.add(Restrictions.like("nome", "%"+nome+"%")).setCacheable(true);
if(lojaId != null)
criteria.add(Restrictions.eq("loja.id", lojaId)).setCacheable(true);
if(categoriaId != null)
criteria.setFetchMode("categorias", FetchMode.JOIN).createAlias("categorias", "c").add(Restrictions.eq("c.id", categoriaId)).setCacheable(true);
return (List<Produto>) criteria.list();