Spring Data JPA怎么調用存儲
Spring Data JPA怎么調用存儲?JPA連接到數(shù)據(jù)庫,調用存儲過程,這樣的需求很常見。本文就針對這一點,講述如何使用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
它需要一個輸入?yún)?shù)inParam1,但不返回值
2)in_and_out_test
它需要一個輸入?yún)?shù)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參數(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);
}
關鍵要點:
@Procedure的name參數(shù)必須匹配@NamedStoredProcedureQuery的name
@Param必須匹配@StoredProcedureParameter注釋的name參數(shù)
返回類型必須匹配:in_only_test存儲過程返回是void,in_and_out_test存儲過程必須返回String
4、調用
我們可以這樣調用存儲過程:
// 向存儲過程傳遞參數(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");
// 向存儲過程傳遞參數(shù)不返回值
myTableRepository.inOnlyTest(inParam);
5、其它技巧
如果上面的代碼不工作,可以這么解決。定義自定義的Repository來調用存儲過程昨晚本地查詢。
定義自定義的Repository:
public interface MyTableRepositoryCustom {
void inOnlyTest(String inParam1);
}
然后要確保主Repository類繼承了這個接口。
復制代碼 代碼如下:
public interface MyTableRepository extends CrudRepository
6、創(chuàng)建Repository實現(xiàn)類
接著該創(chuàng)建Repository實現(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ī)的方式進行調用:
@Autowired
MyTableRepository myTableRepository;
// 調用存儲過程
myTableRepository.inOnlyTest(inParam1);
相關文章:
1. Spring Data JPA 關鍵字Exists的用法說明2. spring data jpa如何只查詢實體部分字段3. 在Spring Data JPA中引入Querydsl的實現(xiàn)方式4. 解決spring data jpa 批量保存更新的問題5. Springboot使用Spring Data JPA實現(xiàn)數(shù)據(jù)庫操作6. Spring Data JPA帶條件分頁查詢實現(xiàn)原理7. Spring data jpa的使用與詳解(復雜動態(tài)查詢及分頁,排序)8. spring data jpa開啟批量插入、批量更新的問題解析9. IDEA 中創(chuàng)建Spring Data Jpa 項目的示例代碼10. spring data jpa 查詢自定義字段,轉換為自定義實體方式
