Spring Boot调用SQL Server存储过程报错:参数2未设置
问题分析与解决方案
问题原因
你的存储过程定义的是单一OUT参数,但Spring Data JPA的@Procedure注解在处理输出参数时,会将输入参数和输出参数分别映射为两个独立参数,导致生成{call validateCustomer(?,?)}这样的调用语句,而第二个参数(输出参数)未被赋值,从而触发参数未设置的错误。
另外,从存储过程逻辑来看,你实际需要的是INOUT参数(既接收输入值,又返回结果),而非单纯的OUT参数。
解决方案
方案1:修改存储过程为INOUT参数
将存储过程的参数类型从out改为inout,使其同时支持输入和输出:
ALTER procedure [dbo].[VALIDATECUSTOMER] @customer nvarchar(max) inout as set @customer = @customer select @customer as customer
同步调整Repository注解,明确参数模式:
@Repository public interface CustomerRepository extends JpaRepository<Customer, BigInteger> { @Procedure(procedureName = "VALIDATECUSTOMER") String validateCustomer(@Param("customer") @ParameterMode(ParameterMode.INOUT) String customer); }
方案2:用@Query直接构造调用语句
如果不想修改存储过程,可通过@Query手动构造调用逻辑,避免Spring Data JPA自动生成多余参数:
@Repository public interface CustomerRepository extends JpaRepository<Customer, BigInteger> { @Query(value = "{call VALIDATECUSTOMER(?1)}", nativeQuery = true) String validateCustomer(@Param("customer") String customer); }
方案3:改为返回结果集(可选)
若仅需返回传入值,可将存储过程改为直接返回结果集,舍弃OUT参数:
ALTER procedure [dbo].[VALIDATECUSTOMER] @customer nvarchar(max) as select @customer as customer
对应Repository方法调整为:
@Repository public interface CustomerRepository extends JpaRepository<Customer, BigInteger> { @Query(value = "exec VALIDATECUSTOMER :customer", nativeQuery = true) String validateCustomer(@Param("customer") String customer); }
验证
修改完成后重新调用API,生成的调用语句会匹配存储过程参数数量,参数未设置的错误将被解决。
内容的提问来源于stack exchange,提问作者lewis machilika
相关产品推荐
相关产品推荐

