如何在Spring Boot中获取Repository更新操作的受影响行数
获取Spring Boot原生更新查询的受影响行数
要获取这个原生更新查询的受影响行数,只需按以下步骤调整代码:
1. 修改Repository方法的返回类型
将原方法的返回值从void改为int(或Integer),JPA的@Modifying注解在执行UPDATE/DELETE语句时,默认会返回执行后受影响的行数。修改后的代码如下:
@Modifying(clearAutomatically = true) @Transactional @Query(nativeQuery = true, value = "UPDATE tb_pessoal_funcionarios SET salario = CAST(salario+(salario * :percentualAumento)/100 AS NUMERIC(18,2)) " + "WHERE id IN (:funcionarioId) " + "AND (:alterarFuncionariosDemitidos IS true OR condicao <> 'Inativo')") int AlterarSalarioSelecionadosPorPercentual(Double percentualAumento, Long funcionarioId, Boolean alterarFuncionariosDemitidos);
2. 在Service层调用并接收返回值
在业务逻辑层直接调用Repository的方法,就能拿到受影响行数,示例代码:
@Service public class FuncionarioService { private final FuncionarioRepository funcionarioRepository; public FuncionarioService(FuncionarioRepository funcionarioRepository) { this.funcionarioRepository = funcionarioRepository; } public int atualizarSalarioPorPercentual(Double percentualAumento, Long funcionarioId, Boolean alterarDemitidos) { return funcionarioRepository.AlterarSalarioSelecionadosPorPercentual(percentualAumento, funcionarioId, alterarDemitidos); } }
3. 在Controller层使用返回值
Controller调用Service方法获取行数后,可根据业务需求返回响应或做其他处理:
@RestController @RequestMapping("/funcionarios") public class FuncionarioController { private final FuncionarioService funcionarioService; public FuncionarioController(FuncionarioService funcionarioService) { this.funcionarioService = funcionarioService; } @PutMapping("/salario/aumento") public ResponseEntity<String> atualizarSalario(@RequestParam Double percentualAumento, @RequestParam Long funcionarioId, @RequestParam Boolean alterarDemitidos) { int linhasAfetadas = funcionarioService.atualizarSalarioPorPercentual(percentualAumento, funcionarioId, alterarDemitidos); return ResponseEntity.ok("成功更新 " + linhasAfetadas + " 条员工薪资记录"); } }
注意事项
@Transactional注解:可根据业务场景决定放在Repository或Service层,确保事务覆盖完整的业务逻辑。clearAutomatically = true:该配置会在查询执行后清空EntityManager缓存,避免后续查询获取到未更新的脏数据。- 参数绑定:确保方法参数名与
@Query中定义的:参数名完全匹配,避免参数绑定失败。
内容的提问来源于stack exchange,提问作者Gabryel Frk
相关产品推荐
相关产品推荐

