ReactiveCrudRepository更新SQL报Binding parameters不支持错误咨询
报错产生原因
该异常是使用Spring Data R2DBC响应式持久层框架时的逻辑校验问题:
- 你使用的
ReactiveCrudRepository属于R2DBC响应式栈组件,旧版本Spring Data R2DBC处理@Modifying标注的更新语句时,不会提前判断SQL中是否存在参数占位符,会默认强制执行参数绑定流程。 - 你写的更新SQL是全硬编码常量的无参语句,没有定义任何
?或者:paramName形式的参数占位符,R2DBC驱动本身不支持对无占位符的语句执行参数绑定操作,因此直接抛出该错误。 - 该问题仅存在于响应式R2DBC栈,传统JDBC实现的Spring Data JPA不会对同类无参硬编码SQL抛出该异常。
修复方案
你可以任选以下一种方案解决:
- 方案1:添加冗余参数骗过框架校验(改造成本最低)
给SQL增加一个恒成立的带占位符条件,配合方法传参让框架正常走完参数绑定流程即可:
调用方法时固定传入值public interface MyReactiveRepository extends ReactiveCrudRepository<MyEntity, String> { @Modifying @Query("update CCPSEDCD.RECFFTAPSE set id=1, tarmoda='c' where id=1 and 1 = :flag") Mono<Integer> runFixedUpdate(@Param("flag") Integer flag); }1即可正常执行。 - 方案2:使用R2dbcEntityTemplate直接执行原生SQL
绕过Repository接口的@Query注解校验逻辑,直接注入R2DBC官方操作客户端执行无参SQL:@Repository public class MyUpdateRepository { private final R2dbcEntityTemplate r2dbcEntityTemplate; public MyUpdateRepository(R2dbcEntityTemplate r2dbcEntityTemplate) { this.r2dbcEntityTemplate = r2dbcEntityTemplate; } public Mono<Integer> runFixedUpdate() { return r2dbcEntityTemplate.getDatabaseClient() .sql("update CCPSEDCD.RECFFTAPSE set id=1, tarmoda='c' where id=1") .fetch() .rowsUpdated(); } } - 方案3:升级框架版本
Spring Data R2DBC 3.2及以上版本已经修复了无参修改语句的参数绑定校验bug,升级项目中对应的Spring Data、Spring Boot依赖版本后,原有不需要传参的硬编码更新SQL可以直接正常运行。
内容的提问来源于stack exchange,提问作者kevin
相关产品推荐
相关产品推荐

