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 {
}
关键要点:
- 存储过程使用了注释@NamedStoredProcedureQuery,并绑定到一个JPA表。
- procedureName是存储过程的名字
- name是JPA中的存储过程的名字
- 使用注释@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);
}
关键要点:
- @Procedure的name参数必须匹配@NamedStoredProcedureQuery的name
- @Param必须匹配@StoredProcedureParameter注释的name参数
- 返回类型必须匹配: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门面实现文件存储与管理

