Spring Data JPA調(diào)用存儲(chǔ)過(guò)程實(shí)例代碼
JPA連接到數(shù)據(jù)庫(kù),調(diào)用存儲(chǔ)過(guò)程,這樣的需求很常見。本文就針對(duì)這一點(diǎn),講述如何使用spring Data JPA調(diào)用存儲(chǔ)過(guò)程的方法。
1、存儲(chǔ)過(guò)程
假設(shè)存儲(chǔ)過(guò)程如下:
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;
這里有兩個(gè)存儲(chǔ)過(guò)程:
1)in_only_test
它需要一個(gè)輸入?yún)?shù)inParam1,但不返回值
2)in_and_out_test
它需要一個(gè)輸入?yún)?shù)inParam1,且返回值outParam1
2、@NamedStoredProcedureQueries
我們可以使用@NamedStoredProcedureQueries注釋來(lái)調(diào)用存儲(chǔ)過(guò)程。
@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 {
}
關(guān)鍵要點(diǎn):
- 存儲(chǔ)過(guò)程使用了注釋@NamedStoredProcedureQuery,并綁定到一個(gè)JPA表。
- procedureName是存儲(chǔ)過(guò)程的名字
- name是JPA中的存儲(chǔ)過(guò)程的名字
- 使用注釋@StoredProcedureParameter來(lái)定義存儲(chǔ)過(guò)程使用的IN/OUT參數(shù)
3、創(chuàng)建Spring Data JPA數(shù)據(jù)庫(kù)
下面我們來(lái)創(chuàng)建Spring Data JPA數(shù)據(jù)庫(kù):
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);
}
關(guān)鍵要點(diǎn):
- @Procedure的name參數(shù)必須匹配@NamedStoredProcedureQuery的name
- @Param必須匹配@StoredProcedureParameter注釋的name參數(shù)
- 返回類型必須匹配:in_only_test存儲(chǔ)過(guò)程返回是void,in_and_out_test存儲(chǔ)過(guò)程必須返回String
4、調(diào)用
我們可以這樣調(diào)用存儲(chǔ)過(guò)程:
// 向存儲(chǔ)過(guò)程傳遞參數(shù)并返回值 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"); // 向存儲(chǔ)過(guò)程傳遞參數(shù)不返回值 myTableRepository.inOnlyTest(inParam);
5、其它技巧
如果上面的代碼不工作,可以這么解決。定義自定義的Repository來(lái)調(diào)用存儲(chǔ)過(guò)程昨晚本地查詢。
定義自定義的Repository:
public interface MyTableRepositoryCustom {
void inOnlyTest(String inParam1);
}
然后要確保主Repository類繼承了這個(gè)接口。
public interface MyTableRepository extends CrudRepository<MyTable, Long>, MyTableRepositoryCustom {}
6、創(chuàng)建Repository實(shí)現(xiàn)類
接著該創(chuàng)建Repository實(shí)現(xiàn)類了:
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();
}
}
可以以常規(guī)的方式進(jìn)行調(diào)用:
@Autowired MyTableRepository myTableRepository; // 調(diào)用存儲(chǔ)過(guò)程 myTableRepository.inOnlyTest(inParam1);
是不是很簡(jiǎn)單。以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Spring Data JPA實(shí)現(xiàn)動(dòng)態(tài)查詢的兩種方法
- spring data jpa使用詳解(推薦)
- Spring Data Jpa的四種查詢方式詳解
- Spring Data JPA實(shí)現(xiàn)動(dòng)態(tài)條件與范圍查詢實(shí)例代碼
- Spring Data JPA 實(shí)現(xiàn)多表關(guān)聯(lián)查詢的示例代碼
- Spring Data JPA 復(fù)雜/多條件組合分頁(yè)查詢
- Spring?Data?Jpa?復(fù)雜查詢方式總結(jié)(多表關(guān)聯(lián)及自定義分頁(yè))
- Spring Data JPA的作用和用法小結(jié)
相關(guān)文章
Springboot Mybatis-Plus數(shù)據(jù)庫(kù)單元測(cè)試實(shí)戰(zhàn)(三種方式)
這篇文章主要介紹了Springboot Mybatis-Plus數(shù)據(jù)庫(kù)單元測(cè)試實(shí)戰(zhàn)(三種方式),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Java中十六進(jìn)制和十進(jìn)制之間互相轉(zhuǎn)換代碼示例
這篇文章主要給大家介紹了關(guān)于Java中十六進(jìn)制和十進(jìn)制之間互相轉(zhuǎn)換的相關(guān)資料,我們項(xiàng)目過(guò)程中總是要用到十進(jìn)制與十六進(jìn)制相互轉(zhuǎn)換的方法,需要的朋友可以參考下2023-07-07
Java,C#使用二進(jìn)制序列化、反序列化操作數(shù)據(jù)
這篇文章主要介紹了Java,C#使用二進(jìn)制序列化、反序列化操作數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2014-10-10
Springboot整合itext實(shí)現(xiàn)PDF文件合并
這篇文章主要為大家詳細(xì)介紹了Springboot整合itext實(shí)現(xiàn)PDF文件合并以及識(shí)別圖片轉(zhuǎn)成PDF拼接的相關(guān)知識(shí),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11
SpringCloud Alibaba項(xiàng)目實(shí)戰(zhàn)之nacos-server服務(wù)搭建過(guò)程
Nacos 是阿里巴巴推出來(lái)的一個(gè)新開源項(xiàng)目,這是一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(tái)。本章節(jié)重點(diǎn)給大家介紹SpringCloud Alibaba項(xiàng)目實(shí)戰(zhàn)之nacos-server服務(wù)搭建過(guò)程,感興趣的朋友一起看看吧2021-06-06
使用注解@Recover優(yōu)化丑陋的循環(huán)詳解
我們知道在實(shí)現(xiàn)一個(gè)功能的時(shí)候是可以使用不同的代碼來(lái)實(shí)現(xiàn)的,那么相應(yīng)的不同實(shí)現(xiàn)方法的性能肯定也是有差別的,下面這篇文章主要給大家介紹了關(guān)于使用注解@Recover優(yōu)化丑陋的循環(huán)的相關(guān)資料,需要的朋友可以參考下2022-04-04

