溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Data 利用JPA如何實(shí)現(xiàn)調(diào)用存儲(chǔ)過(guò)程

發(fā)布時(shí)間:2020-11-17 15:19:45 來(lái)源:億速云 閱讀:1174 作者:Leah 欄目:編程語(yǔ)言

這篇文章給大家介紹Spring Data 利用JPA如何實(shí)現(xiàn)調(diào)用存儲(chǔ)過(guò)程,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

JPA連接到數(shù)據(jù)庫(kù),調(diào)用存儲(chǔ)過(guò)程,這樣的需求很常見(jiàn)。本文就針對(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):

  1. 存儲(chǔ)過(guò)程使用了注釋@NamedStoredProcedureQuery,并綁定到一個(gè)JPA表。
  2. procedureName是存儲(chǔ)過(guò)程的名字
  3. name是JPA中的存儲(chǔ)過(guò)程的名字
  4. 使用注釋@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):

  1. @Procedure的name參數(shù)必須匹配@NamedStoredProcedureQuery的name
  2. @Param必須匹配@StoredProcedureParameter注釋的name參數(shù)
  3. 返回類型必須匹配: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è)接口。

復(fù)制代碼 代碼如下:

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);

關(guān)于Spring Data 利用JPA如何實(shí)現(xiàn)調(diào)用存儲(chǔ)過(guò)程就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI