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

如何使用Hibernate Reactive调用带输出参数的存储过程?

使用Hibernate响应式API调用带输出参数的存储过程

要调用带输出参数的存储过程,你可以通过ReactiveConnectionSupplier获取响应式数据库连接,再结合JDBC的CallableStatement来处理输出参数。以下是针对你提供的uspSum存储过程的实现示例:

实现步骤与代码示例

假设你已在项目中配置好Hibernate响应式依赖,下面是一个Service层的实现:

import org.hibernate.reactive.mutiny.Mutiny;
import jakarta.enterprise.context.ApplicationScoped;
import java.sql.Types;
import java.util.concurrent.CompletionStage;

@ApplicationScoped
public class StoredProcedureService {

    private final Mutiny.SessionFactory sessionFactory;

    // 注入SessionFactory,从中获取响应式连接供应商
    public StoredProcedureService(Mutiny.SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    public CompletionStage<Integer> callUspSum(int param1, int param2) {
        // 获取响应式连接并执行存储过程调用
        return sessionFactory.withSession(session -> session.getReactiveConnection())
                .flatMap(connection -> {
                    String callSql = "{call uspSum(?, ?, ?)}";
                    return connection.prepareCall(callSql)
                            .invoke(callable -> {
                                // 设置输入参数
                                callable.setInt(1, param1);
                                callable.setInt(2, param2);
                                // 注册输出参数,指定位置与SQL类型
                                callable.registerOutParameter(3, Types.INTEGER);
                            })
                            .flatMap(Mutiny.CallableStatement::executeUpdate)
                            .flatMap(result -> result.getCallableStatement().getInt(3));
                })
                .toCompletionStage();
    }
}

关键说明

  • ReactiveConnection:通过Session的getReactiveConnection()方法获取,是Hibernate响应式API对JDBC连接的封装。
  • CallableStatement:使用JDBC标准语法{call 存储过程名(参数列表)},?作为参数占位符。
  • 输出参数注册:必须通过registerOutParameter指定输出参数的位置和SQL类型,否则无法正确读取输出值。
  • 资源管理:Hibernate响应式API会自动管理连接、Statement等资源的释放,无需手动关闭。

调用示例

在业务代码中可以这样调用:

storedProcedureService.callUspSum(5, 7)
        .thenAccept(result -> System.out.println("存储过程执行结果:" + result))
        .exceptionally(e -> {
            e.printStackTrace();
            return null;
        });

内容的提问来源于stack exchange,提问作者Manuel Ferreira Colchete Neto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:05:15