You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询返回List<String>报Double转String错误,如何正确显示列表?

问题分析与解决方案

你的报错java.lang.Double cannot be cast to java.lang.String本质是JPQL查询返回的结果类型和你声明的接收类型不匹配。

为什么会出错?

你在JPQL中同时查询了两个字段:groupe(字符串类型)和AVG(tauxCharge)(Double类型的聚合值),这种情况下JPA会返回一个**Object[]的列表**——每个数组的第一个元素是groupe,第二个是计算出的平均负载率。但你用List<String>来接收这个结果,强制把Object[]转成String,就会触发类型转换异常。

解决方案1:直接使用Object[]接收结果

这是最快速的修改方式,不需要额外创建类:

  1. 先修改仓库方法的返回类型:
@Query("select groupe, AVG(tauxCharge) from EquilibrageFrequentiel E where tauxCharge is not null and tauxCharge != '0'" + " and base=:base group by groupe")
public List<Object[]> tauxDeChargeParLigne(@Param("base")Long base);
  1. 然后在控制器中遍历数组,取出对应元素:
List<Object[]> tauxDeChargeAssemblage1 = EquilibrageFrequentielService.tauxDeChargeAssemlage(base1);
for (Object[] item : tauxDeChargeAssemblage1) {
    // 第一个元素是分组groupe(String类型)
    String groupe = (String) item[0];
    // 第二个元素是平均负载率(Double类型)
    Double avgTauxCharge = (Double) item[1];
    System.out.println("分组: " + groupe + ", 平均负载率: " + avgTauxCharge);
}

解决方案2:用DTO封装结果(更优雅的方式)

如果想让代码更易读、可维护,可以创建一个DTO类来封装查询结果:

  1. 先创建DTO类(替换成你自己的包路径):
public class TauxChargeGroupeDTO {
    private String groupe;
    private Double avgTauxCharge;

    // 必须提供对应参数的构造函数,JPQL会用它来实例化对象
    public TauxChargeGroupeDTO(String groupe, Double avgTauxCharge) {
        this.groupe = groupe;
        this.avgTauxCharge = avgTauxCharge;
    }

    // 提供getter方法(或者用Lombok的@Data注解简化)
    public String getGroupe() {
        return groupe;
    }

    public Double getAvgTauxCharge() {
        return avgTauxCharge;
    }
}
  1. 修改JPQL查询,使用构造函数返回DTO:
// 注意要写全DTO的类路径
@Query("select new com.yourpackage.TauxChargeGroupeDTO(E.groupe, AVG(E.tauxCharge)) from EquilibrageFrequentiel E where E.tauxCharge is not null and E.tauxCharge != '0' and E.base=:base group by E.groupe")
public List<TauxChargeGroupeDTO> tauxDeChargeParLigne(@Param("base")Long base);
  1. 控制器中直接遍历DTO对象:
List<TauxChargeGroupeDTO> tauxDeChargeAssemblage1 = EquilibrageFrequentielService.tauxDeChargeAssemlage(base1);
for (TauxChargeGroupeDTO dto : tauxDeChargeAssemblage1) {
    System.out.println("分组: " + dto.getGroupe() + ", 平均负载率: " + dto.getAvgTauxCharge());
}

这样修改后,就能正常打印分组和对应的平均负载率啦~

内容的提问来源于stack exchange,提问作者Luc Thilliez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:50:52