You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 03:36:03