Spring Data JPA加@Modifying执行更新查询仍报DML操作不支持如何解决
Spring Data JPA DML更新报错解决方案
错误根因
@Modifying 标注的UPDATE/DELETE类DML操作,仅支持 void 或 int/Integer 两种返回值类型,前者表示无需感知操作结果,后者返回本次操作影响的数据库行数。
你的代码中将方法返回值定义为 List<CustomerTransaction>,框架会将语句判定为普通查询而非DML操作,因此即使添加了@Modifying注解仍会抛出“Not supported for DML operations”错误。
修复方案
将方法返回值调整为符合规范的类型即可,示例代码如下:
@Transactional @Modifying @Query("update CustomerTransaction ct set ct.amountPayment =:trnAmount WHERE ct.loanAccount.id=:loanAccountId AND ct.paymentTerm=:paymentTerm") int updateCurrentCustomerTransaction(@Param("loanAccountId") long loanAccountId, @Param("paymentTerm") int paymentTerm, @Param("trnAmount") BigDecimal trnAmount);
若不需要获取受影响行数,可将返回值改为 void。
补充建议
- 业务开发中推荐将
@Transactional注解放置在Service层的业务方法上,更便于控制事务粒度,放在Repository层也可生效但不符合分层最佳实践 - 若需要获取更新后的实体数据,需先执行更新方法,再单独调用查询接口获取最新数据,无法在DML方法中直接返回实体集合
内容的提问来源于stack exchange,提问作者Aandre Mc Jerome Abril
相关产品推荐
相关产品推荐

