Spring Boot调用无参存储过程报参数1不是OUT参数错误如何解决?
问题解决方法
报错原因
你遇到的报错是因为@Procedure注解默认会按照带OUT输出参数的逻辑解析存储过程,但你定义的MySQL存储过程没有声明OUT参数,而是直接返回SELECT查询的结果集,且没有入参,和默认解析逻辑不匹配导致报错。
可行解决方式
方案1:使用原生SQL注解调用(最简便,无兼容问题)
直接在DAO层用@Query注解写原生SQL调用存储过程,不需要额外配置:
// 注意DAO接口名建议遵循大驼峰命名规范 public interface CoursesDao extends JpaRepository<Course, Integer>{ // 直接调用无参存储过程 @Query(value = "CALL Getit()", nativeQuery = true) // 如果确定只会返回1条title,可以把返回值改为String,否则用List<String>接收多条结果 List<String> Getit(); }
调用代码无需修改,如果返回单个结果可以自行取List第0位元素即可。
方案2:通过NamedStoredProcedureQuery配合@Procedure调用
如果一定要使用@Procedure注解实现,需要先在Course实体类上声明存储过程的定义:
@Entity @NamedStoredProcedureQuery( // 自定义的查询名称,格式为【实体类名.方法名】 name = "Course.Getit", // 对应数据库中的存储过程名称 procedureName = "Getit", // 明确声明没有参数 parameters = {}, // 声明返回结果的类型 resultClasses = String.class ) public class Course { // 原有实体类的属性、getter、setter保持不变 }
再修改DAO层的注解:
public interface CoursesDao extends JpaRepository<Course, Integer>{ // 对应实体类上定义的NamedStoredProcedureQuery的name属性 @Procedure(name = "Course.Getit") List<String> Getit(); }
两种方案都可以解决无参存储过程调用的报错问题,优先推荐方案1,写法更简洁兼容性更好。
内容的提问来源于stack exchange,提问作者Himanshu Ranjan
相关产品推荐
相关产品推荐

