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