首页 > 解决方案 > 调用 jpa 存储库中的存储过程时出现错误位置参数 [1] 未在此过程调用中注册

问题描述

我正在尝试调用一个基本的 oracle pl/sql 存储过程,它从表学生(姓名、年龄、电子邮件)返回一个字符串。我正在使用命名存储过程注释,但在执行逻辑时出现错误。我会很感激你的帮助。

CREATE OR REPLACE PROCEDURE p_findemail (email OUT VARCHAR2)
IS 
BEGIN
    SELECT EMAIL INTO email FROM STUDENT WHERE ID=1;
END p_findemail;


@Entity
@Table(name="Student")

@NamedStoredProcedureQueries({
    @NamedStoredProcedureQuery(
        name="p_findemail",
        procedureName = "p_findemail",
        parameters = {
            @StoredProcedureParameter(name="email" , mode = ParameterMode.OUT , type=String.class)
        }
        
    )
})


public class Student {
@Repository
public interface StudentRepository extends CrudRepository<Student,Long>{     
    
    @Procedure(value = "p_findemail",                  
                name = "p_findemail",
                outputParameterName = "email")

    String findstudentbyid();      
    
}

这是我得到的错误

错误 2864 --- [nio-8080-exec-1] oaccC[.[.[/].[dispatcherServlet]:Servlet.service() 用于路径 [] 上下文中的 servlet [dispatcherServlet] 引发异常 [请求处理失败;嵌套异常是 org.springframework.dao.InvalidDataAccessApiUsageException: Positional parameter [1] is not registered with this procedure call; 嵌套异常是 java.lang.IllegalArgumentException: Positional parameter [1] is not registered with this procedure call] 根本原因

java.lang.IllegalArgumentException:位置参数 [1] 未在 org.hibernate.query.procedure.internal.ProcedureParameterMetadata.getQueryParameter(ProcedureParameterMetadata.java:141) 注册此过程调用

标签: javaoraclespring-bootspring-data-jpa

解决方案


问题似乎是 Spring-Data-JPA

[https://github.com/spring-projects/spring-data-jpa/issues/2188][1]

对我有用的修复是:

将输出参数更改为 INOUT

  @StoredProcedureParameter(name="email" , mode = ParameterMode.INOUT ,
  type=String.class)
 

    

而同时从存储库调用您的存储过程

 @Procedure(name = STORED_PROC_NAME)
  
 // email is passed as null
 String findstudentbyid(@Param("email") String email);
 
 and pass this email as null.

PS:您可能必须使用 Map 或 String 作为您的返回类型,具体取决于您存储的 pro 返回的内容。


推荐阅读