如何迭代Spring@Entity注解类列表?解决ClassCastException问题
解决java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to br.com.meupacote.model.Usuario的问题
嘿,我来帮你捋清楚这个问题~你遇到的ClassCastException本质原因很明确:你以为degV是List<Usuario>,但它实际是List<Object[]>(对象数组列表),所以当你尝试把数组强制转成Usuario实体时就报错了。
为什么会出现这种情况?
大概率是你获取degV的查询语句有问题:
- 如果你用的是JPQL/SQL查询,要是写的是
SELECT u.id, u.dtaInicio, u.dtaFim FROM Usuario u ...这种只查询部分字段的语句,Hibernate/JPA不会返回Usuario实体实例,而是返回包含对应字段值的Object[]; - 如果是关联查询、分组查询,也经常会返回对象数组而不是单一实体。
针对你的代码的解决方案
根据你要构建Degustacao对象的需求,给你两种可行的处理方式:
方式1:直接处理对象数组(适合不想改查询的情况)
把循环逻辑改成遍历Object[],根据查询返回的字段顺序取出对应值:
List<Deg> lista = new ArrayList<>(); // 注意这里的循环类型改成Object[] for (Object[] d : degV) { // 假设你的查询返回顺序是:Usuario的id(复合主键)、dtaInicio、dtaFim UsuarioId usuarioId = (UsuarioId) d[0]; LocalDate dtaInicio = (LocalDate) d[1]; LocalDate dtaFim = (LocalDate) d[2]; Deg dgust = Degustacao.builder() .codProduto(usuarioId.getCodProduto()) .dataInicio(dtaInicio) .dataFim(dtaFim) .build(); lista.add(dgust); }
用Stream流的写法也可以:
import java.util.stream.Collectors; List<Deg> lista = degV.stream() .map(item -> { Object[] arr = (Object[]) item; UsuarioId usuarioId = (UsuarioId) arr[0]; LocalDate dtaInicio = (LocalDate) arr[1]; LocalDate dtaFim = (LocalDate) arr[2]; return Degustacao.builder() .codProduto(usuarioId.getCodProduto()) .dataInicio(dtaInicio) .dataFim(dtaFim) .build(); }) .collect(Collectors.toList());
方式2:修改查询语句,直接返回目标对象(更规范的做法)
如果你能调整查询语句,推荐用JPA的构造函数查询,直接返回Degustacao实例,从根源避免类型转换问题:
- 确保
Degustacao有对应的构造函数(比如包含codProduto、dataInicio、dataFim的构造方法); - 修改JPQL查询:
List<Degustacao> degV = entityManager.createQuery( "SELECT new br.com.meupacote.model.Degustacao(u.id.codProduto, u.dtaInicio, u.dtaFim) " + "FROM Usuario u WHERE ...", // 你的查询条件 Degustacao.class ).getResultList();
这样degV就是List<Degustacao>,你原来的循环逻辑就能直接用啦~
额外小提醒
看你的代码里变量名有点混淆(比如degV和Degustacao相关,但你说迭代Usuario类),建议确认下查询返回的内容和变量命名对应上,避免后续混淆哦~
内容的提问来源于stack exchange,提问作者Dai
相关产品推荐
相关产品推荐

