如何使用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
相关产品推荐
相关产品推荐

