Spring Data JPA调用存储过程实例代码

发布时间 - 2026-01-11 00:41:21    点击率:

JPA连接到数据库,调用存储过程,这样的需求很常见。本文就针对这一点,讲述如何使用spring Data JPA调用存储过程的方法。

1、存储过程

假设存储过程如下:

CREATE OR REPLACE PACKAGE test_pkg AS
  PROCEDURE in_only_test (inParam1 IN VARCHAR2);
  PROCEDURE in_and_out_test (inParam1 IN VARCHAR2, outParam1 OUT VARCHAR2);
END test_pkg;
/
CREATE OR REPLACE PACKAGE BODY test_pkg AS
  PROCEDURE in_only_test(inParam1 IN VARCHAR2) AS
  BEGIN
   DBMS_OUTPUT.PUT_LINE('in_only_test');
  END in_only_test;
  PROCEDURE in_and_out_test(inParam1 IN VARCHAR2, outParam1 OUT VARCHAR2) AS
  BEGIN
   outParam1 := 'Woohoo Im an outparam, and this is my inparam ' || inParam1;
  END in_and_out_test;
END test_pkg;

这里有两个存储过程:

1)in_only_test

它需要一个输入参数inParam1,但不返回值

2)in_and_out_test

它需要一个输入参数inParam1,且返回值outParam1

2、@NamedStoredProcedureQueries

我们可以使用@NamedStoredProcedureQueries注释来调用存储过程。

@Entity
@Table(name = "MYTABLE")
@NamedStoredProcedureQueries({
    @NamedStoredProcedureQuery(name = "in_only_test", procedureName = "test_pkg.in_only_test", parameters = {
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "inParam1", type = String.class) }),
    @NamedStoredProcedureQuery(name = "in_and_out_test", procedureName = "test_pkg.in_and_out_test", parameters = {
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "inParam1", type = String.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "outParam1", type = String.class) }) })
public class MyTable implements Serializable {
}

关键要点:

  1. 存储过程使用了注释@NamedStoredProcedureQuery,并绑定到一个JPA表。
  2. procedureName是存储过程的名字
  3. name是JPA中的存储过程的名字
  4. 使用注释@StoredProcedureParameter来定义存储过程使用的IN/OUT参数

3、创建Spring Data JPA数据库

下面我们来创建Spring Data JPA数据库:

public interface MyTableRepository extends CrudRepository<MyTable, Long> {
  @Procedure(name = "in_only_test")
  void inOnlyTest(@Param("inParam1") String inParam1);

  @Procedure(name = "in_and_out_test")
  String inAndOutTest(@Param("inParam1") String inParam1);
}

关键要点:

  1. @Procedure的name参数必须匹配@NamedStoredProcedureQuery的name
  2. @Param必须匹配@StoredProcedureParameter注释的name参数
  3. 返回类型必须匹配:in_only_test存储过程返回是void,in_and_out_test存储过程必须返回String

4、调用

我们可以这样调用存储过程:

  // 向存储过程传递参数并返回值
  String inParam = "Hi Im an inputParam";
  String outParam = myTableRepository.inAndOutTest(inParam);
  Assert.assertEquals(outParam, "Woohoo Im an outparam, and this is my inparam Hi Im an inputParam");
  // 向存储过程传递参数不返回值
  myTableRepository.inOnlyTest(inParam);

5、其它技巧

如果上面的代码不工作,可以这么解决。定义自定义的Repository来调用存储过程昨晚本地查询。

定义自定义的Repository:

public interface MyTableRepositoryCustom {
  void inOnlyTest(String inParam1);
}

然后要确保主Repository类继承了这个接口。

复制代码 代码如下:
public interface MyTableRepository extends CrudRepository<MyTable, Long>, MyTableRepositoryCustom {}

6、创建Repository实现类

接着该创建Repository实现类了:

public class MyTableRepositoryImpl implements MyTableRepositoryCustom { 
@PersistenceContext 
private EntityManager em;

@Override
public void inOnlyTest(String inParam1) {
  this.em.createNativeQuery("BEGIN in_only_test(:inParam1); END;").setParameter("inParam1", inParam1)
      .executeUpdate();
}
}

可以以常规的方式进行调用:

@Autowired
MyTableRepository myTableRepository;
// 调用存储过程
myTableRepository.inOnlyTest(inParam1);

是不是很简单。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# jpa  # 调用存储过程  # 存储过程  # spring  # Spring Data JPA实现动态查询的两种方法  # spring data jpa使用详解(推荐)  # Spring Data Jpa的四种查询方式详解  # Spring Data JPA实现动态条件与范围查询实例代码  # Spring Data JPA 实现多表关联查询的示例代码  # Spring Data JPA 复杂/多条件组合分页查询  # Spring Data Jpa 复杂查询方式总结(多表关联及自定义分页)  # Spring Data JPA的作用和用法小结  # 返回值  # 自定义  # 我们可以  # 很简单  # 可以使用  # 但不  # 绑定  # 连接到  # 如何使用  # 大家多多  # 昨晚  # 使用了  # 有两个  # 继承了  # StoredProcedureParameter  # br  # Im  # Woohoo  # inparam 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 利用vue写todolist单页应用  如何彻底删除建站之星生成的Banner?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  利用 Google AI 进行 YouTube 视频 SEO 描述优化  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  Laravel如何实现API速率限制?(Rate Limiting教程)  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  想要更高端的建设网站,这些原则一定要坚持!  公司门户网站制作流程,华为官网怎么做?  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  如何在宝塔面板创建新站点?  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  Laravel怎么使用artisan命令缓存配置和视图  免费网站制作appp,免费制作app哪个平台好?  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  JavaScript模板引擎Template.js使用详解  Laravel如何使用Collections进行数据处理?(实用方法示例)  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  lovemo网页版地址 lovemo官网手机登录  Java解压缩zip - 解压缩多个文件或文件夹实例  如何在阿里云部署织梦网站?  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  PythonWeb开发入门教程_Flask快速构建Web应用  如何用AWS免费套餐快速搭建高效网站?  Android滚轮选择时间控件使用详解  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  如何快速上传自定义模板至建站之星?  5种Android数据存储方式汇总  Python结构化数据采集_字段抽取解析【教程】  如何快速搭建高效WAP手机网站?  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  如何用低价快速搭建高质量网站?  如何快速生成凡客建站的专业级图册?  如何用PHP快速搭建高效网站?分步指南  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  如何在IIS7中新建站点?详细步骤解析  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Laravel怎么实现验证码(Captcha)功能  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  如何快速查询域名建站关键信息?  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理