如何从休眠中调用具有 IN 和 OUT 参数的存储过程

我想从休眠中调用一个存储过程,它返回一个输出值。这是我的存储过程。

create procedure myProcedure
(  
in in_Id int,  
out out_Id int  
)  
begin  
...  
END;

我正在尝试调用我的程序

Query query = session.createSQLQuery(  
"CALL myProcedure(:in_Id)")  
.setParameter("in_id", 123);   
//Not sure how to register out parameters...??      
List result = query.list();

我尝试了一切,但没有运气。你能帮帮我吗?如果我尝试上面的内容,它说:

PROCEDURE myProcedure 的参数数量不正确;预期 2,得到 1

我试图添加一个out参数,如

myProcedure(:out_id:in_Id)

但后来它说

未设置所有命名参数:

我不知道如何设置 out 参数?是不是像下面这样?

.setParameter("out_id", ?);

任何帮助是值得赞赏的:)


答案 1

考虑到您有一个输出基本类型的简单存储过程:

CREATE PROCEDURE count_comments (
   IN postId INT, 
   OUT commentCount INT
) 
BEGIN
    SELECT COUNT(*) INTO commentCount 
    FROM post_comment  
    WHERE post_comment.post_id = postId; 
END

您可以使用 JPA StoredProcedureQuery 调用此存储过程:

StoredProcedureQuery query = entityManager
    .createStoredProcedureQuery("count_comments")
    .registerStoredProcedureParameter(
        "postId", Long.class, ParameterMode.IN)
    .registerStoredProcedureParameter(
        "commentCount", Long.class, ParameterMode.OUT)
    .setParameter("postId", 1L);
 
query.execute();
 
Long commentCount = (Long) query
    .getOutputParameterValue("commentCount");

答案 2

执行此操作的最简单方法是将 out 参数作为返回参数的一部分返回(仅当您有权访问存储过程时才相关)。
jest 添加一个商店过程,如下所示

create procedure myProcedure_only_in_parms (
   in in_Id int)
begin
call myProcedure(in_id,@out_Id) ;
select @out_id
END;

完成后,按照以下方式将其与Hibernet一起使用非常简单

Query query = session.createSQLQuery(
"CALL myProcedure_only_in_parms (:in_Id)")
.setParameter("in_id", 123);
List result = query.list();

结果包含out参数,如果要返回乘法参数,可以通过选择@parm1,@parm2,... ,@parmn

希望它有所帮助来添加它


推荐