Spring Data JPA調(diào)用存儲(chǔ)過程實(shí)例代碼
JPA連接到數(shù)據(jù)庫(kù),調(diào)用存儲(chǔ)過程,這樣的需求很常見。本文就針對(duì)這一點(diǎn),講述如何使用spring Data JPA調(diào)用存儲(chǔ)過程的方法。
1、存儲(chǔ)過程
假設(shè)存儲(chǔ)過程如下:
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ǔ)過程:
1)in_only_test
它需要一個(gè)輸入?yún)?shù)inParam1,但不返回值
2)in_and_out_test
它需要一個(gè)輸入?yún)?shù)inParam1,且返回值outParam1
2、@NamedStoredProcedureQueries
我們可以使用@NamedStoredProcedureQueries注釋來調(diào)用存儲(chǔ)過程。
@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ǔ)過程使用了注釋@NamedStoredProcedureQuery,并綁定到一個(gè)JPA表。
- procedureName是存儲(chǔ)過程的名字
- name是JPA中的存儲(chǔ)過程的名字
- 使用注釋@StoredProcedureParameter來定義存儲(chǔ)過程使用的IN/OUT參數(shù)
3、創(chuàng)建Spring Data JPA數(shù)據(jù)庫(kù)
下面我們來創(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ǔ)過程返回是void,in_and_out_test存儲(chǔ)過程必須返回String
4、調(diào)用
我們可以這樣調(diào)用存儲(chǔ)過程:
// 向存儲(chǔ)過程傳遞參數(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ǔ)過程傳遞參數(shù)不返回值 myTableRepository.inOnlyTest(inParam);
5、其它技巧
如果上面的代碼不工作,可以這么解決。定義自定義的Repository來調(diào)用存儲(chǔ)過程昨晚本地查詢。
定義自定義的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ǔ)過程 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)文章
詳解Java對(duì)象結(jié)構(gòu)與對(duì)象鎖的升級(jí)
這篇文章主要為大家詳細(xì)介紹了Java對(duì)象結(jié)構(gòu)與對(duì)象鎖的升級(jí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03SpringBoot之logback-spring.xml不生效的解決方法
這篇文章主要介紹了SpringBoot之logback-spring.xml不生效的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01Java數(shù)組隊(duì)列概念與用法實(shí)例分析
這篇文章主要介紹了Java數(shù)組隊(duì)列概念與用法,結(jié)合實(shí)例形式分析了Java數(shù)組隊(duì)列相關(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-03-03SpringBoot多模塊打包部署Docker的項(xiàng)目實(shí)戰(zhàn)
本文通過介紹最常見的Maven管理的Spring Boot項(xiàng)目多模塊打包部署Docker來介紹一下項(xiàng)目部署過程中操作流程和幾個(gè)需要注意的點(diǎn),具有一定的參加價(jià)值,感興趣的可以了解一下2023-08-08SpringBoot使用 druid 連接池來優(yōu)化分頁(yè)語句
這篇文章主要介紹了SpringBoot使用 druid 連接池來優(yōu)化分頁(yè)語句,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11AJAX+JAVA用戶登陸注冊(cè)驗(yàn)證的實(shí)現(xiàn)代碼
這篇文章主要介紹了AJAX+JAVA用戶登陸注冊(cè)驗(yàn)證的實(shí)現(xiàn)代碼,通過ajax異步刷新頁(yè)面驗(yàn)證用戶輸入的賬號(hào)密碼是否在數(shù)據(jù)庫(kù)中存在。非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-06-06一文搞懂Java中對(duì)象池的實(shí)現(xiàn)
池化并不是什么新鮮的技術(shù),它更像一種軟件設(shè)計(jì)模式,主要功能是緩存一組已經(jīng)初始化的對(duì)象,以供隨時(shí)可以使用。本文將為大家詳細(xì)講講Java中對(duì)象池的實(shí)現(xiàn),需要的可以參考一下2022-07-07Spring-cloud 服務(wù)發(fā)現(xiàn)與消費(fèi)(以ribbon為例)
這篇文章主要介紹了Spring-cloud 服務(wù)發(fā)現(xiàn)與消費(fèi)(以ribbon為例),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04springboot項(xiàng)目關(guān)閉swagger如何防止漏洞掃描
這篇文章主要介紹了springboot項(xiàng)目關(guān)閉swagger如何防止漏洞掃描,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-05-05