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

如何使用Spring Data JPA实现数据库两列字段的求和运算

问题原因

  • Repository层JPQL语法错误:JPQL基于实体类查询而非数据库表名,你写的FROM money不符合规范,应该用实体类名UserModel;且自定义查询仅返回id和求和结果,无法自动映射为完整UserModel对象,会触发类型转换异常。
  • Repository方法定义不规范:findAllByTotal是方法名,后面必须加()才符合Java接口方法的定义规则。
  • 各层返回类型不匹配:Service层getTotal方法声明返回List<UserModel>,但Controller层对应接口声明返回Float,类型不一致会直接报错。
  • 求和逻辑缺失:没有将两列求和的结果赋值给total字段的处理逻辑。

修复方案(两种可选)

方案1:业务层计算(代码改动最小,无需自定义JPQL)

不需要修改Repository层代码,直接在Service层遍历查询结果完成计算:

1. 修改Service层代码

// 如果需要返回所有用户的总收支合计
public Float getTotal() {
    List<UserModel> userList = userRepository.findAll();
    float totalSum = 0F;
    for (UserModel user : userList) {
        // 计算单个用户的收支和并赋值给total字段
        Float userTotal = user.getValueIncome() + user.getOutcomeValue();
        user.setTotal(userTotal);
        totalSum += userTotal;
    }
    return totalSum;
}

// 如果需要返回每个用户的明细+各自的收支和,用这个方法
public List<UserModel> getTotalList() {
    List<UserModel> userList = userRepository.findAll();
    userList.forEach(user -> user.setTotal(user.getValueIncome() + user.getOutcomeValue()));
    return userList;
}

2. 调整Controller层(按需二选一)

如果返回所有用户总收支合计,保持现有Controller代码即可;如果返回每个用户的明细列表,修改如下:

@CrossOrigin
@GetMapping("/users/total")
public List<UserModel> getTotal(){
    return userService.getTotalList();
}

方案2:JPQL直接完成求和计算

如果需要在查询层面完成求和逻辑,按如下修改:

1. 修复Repository层代码

public interface UserRepository extends JpaRepository<UserModel, Integer> {
    // 查询所有用户合计收支总和
    @Query("SELECT SUM(u.valueIncome + u.outcomeValue) FROM UserModel u")
    Float findTotalSum();
}

2. 修改Service层代码

public Float getTotal() {
    return userRepository.findTotalSum();
}

内容的提问来源于stack exchange,提问作者Gabriel Nunes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:36:04