java - 调用 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) 注册此过程调用
解决方案
问题似乎是 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 返回的内容。
推荐阅读
- java - 如何转换 JEXL 表达式的类型?
- mysql - 无法登录到 Wamp 服务器中的 phpMyadmin
- serverless-framework - 从无服务器函数中获取 SQS URL 名称?
- javascript - 在 Node-Postgres 中使用对象数组执行批量更新的最快方法?
- performance - 如何将 2 个 teradata 查询合并为一个
- app-inventor - 如何在 AppInventor 中获取声音持续时间?
- mutt - 某些 utf-8 字符会破坏 mutt 中的主题行
- java - 在 Java 上调用 isPresent 的最佳方式可选
- arduino - MPU6050 FIFO溢出和冻结问题
- vue.js - ion-icon 没有在 ionic vue 中显示图标