技術(shù)員聯(lián)盟提供win764位系統(tǒng)下載,win10,win7,xp,裝機(jī)純凈版,64位旗艦版,綠色軟件,免費(fèi)軟件下載基地!

當(dāng)前位置:主頁 > 教程 > 服務(wù)器類 >

Spring Data JPA調(diào)用存儲(chǔ)過程實(shí)例代碼實(shí)例

來源:技術(shù)員聯(lián)盟┆發(fā)布時(shí)間:2017-05-29 18:11┆點(diǎn)擊:

  JPA連接到數(shù)據(jù)庫,調(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ù)庫

  下面我們來創(chuàng)建Spring Data JPA數(shù)據(jù)庫:

  public interface MyTableRepository extends CrudRepository

  @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è)接口。

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

  public interface MyTableRepository extends CrudRepository

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