如何使用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
相关产品推荐
相关产品推荐

