4
respostas

Como usar cached query com CriteriaQuery

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();
    }
4 respostas

Opa, depois que você chama o createQuery, ele te retorna um objeto do tipo TypedQuery também.. chama o setHint nele :).

Alberto, pelo que vi na documentação (e foi usado ali acima), ele retorna apenas CriteriaQuery.

Estou construindo a query com em.getCriteriaBuilder().createQuery(), assim, ele ta chamando o create query do CriteriaBuilder, e aí minha query é uma instância de CriteriaQuery.

Opa, tava me referindo ao que eh retornado pelo entityManager.createQuery.

Mas e com o CriteriaQuery, é possível? Dessa forma como está no código acima, é possível adicionar hint para usar cache (ou usar cache de alguma outra forma na query)?