3
respostas

nested exception is java.lang.ClassCastException

Olá Professor, ao testar recebo a seguinte mensagem:

HTTP Status 500 - Request processing failed; nested exception is java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljavax.persistence.criteria.Predicate;

Analisando a mensagem de erro vi que está assim:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljavax.persistence.criteria.Predicate; br.com.caelum.dao.ProdutoDao.getProdutos(ProdutoDao.java:66)

Ou seja ha um erro ao fazer o cast de predicates para Predicate[].

Segue abaixo meu código:

package br.com.caelum.dao;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.springframework.stereotype.Repository;

import br.com.caelum.model.Loja;
import br.com.caelum.model.Produto;

@Repository
public class ProdutoDao {

    @PersistenceContext
    private EntityManager em;

    public List<Produto> getProdutos() {
        return em.createQuery("from Produto", Produto.class).getResultList();
    }

    public Produto getProduto(Integer id) {
        Produto produto = em.find(Produto.class, id);
        return produto;
    }

    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> lojaPath = root.<Loja>get("loja").<Integer>get("id");
        Path<Integer> categoriaPath = root.join("categorias").<Integer>get("id");

        List<Predicate> predicates = new ArrayList<>();

        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);
        }

        criteriaBuilder.equal(categoriaPath, categoriaId);
        criteriaBuilder.equal(lojaPath, lojaId);

        query.where((Predicate[]) predicates.toArray());

        TypedQuery<Produto> typedQuery = em.createQuery(query);

        return typedQuery.getResultList();
    }

    public void insere(Produto produto) {
        if (produto.getId() == null)
            em.persist(produto);
        else
            em.merge(produto);
    }

}

Grato

3 respostas

Opa, aqui vai ajudar se você apontar a linha 66 do seu dao, como a exception está indicando.

Olá Alberto, obrigado e desculpa cara, eu vacilei em esquecer de apontar mas é nessa linha aqui:

query.where((Predicate[]) predicates.toArray());

:D

Tenta fazer assim:

query.where(predicates.toArray(new Predicate[]));

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software