Spring Data JPA怎么調(diào)用存儲
Spring Data JPA怎么調(diào)用存儲?JPA連接到數(shù)據(jù)庫,調(diào)用存儲過程,這樣的需求很常見。本文就針對這一點,講述如何使用spring Data JPA調(diào)用存儲過程的方法。
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注釋來調(diào)用存儲過程。
@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、調(diào)用
我們可以這樣調(diào)用存儲過程:
// 向存儲過程傳遞參數(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來調(diào)用存儲過程昨晚本地查詢。
定義自定義的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ī)的方式進行調(diào)用:
@Autowired
MyTableRepository myTableRepository;
// 調(diào)用存儲過程
myTableRepository.inOnlyTest(inParam1);
相關文章:
1. Spring Data JPA 關鍵字Exists的用法說明2. Spring Data JPA的Audit功能審計數(shù)據(jù)庫的變更3. Spring Data JPA帶條件分頁查詢實現(xiàn)原理4. 使用Spring Data Jpa的CriteriaQuery一個陷阱5. 在Spring Data JPA中引入Querydsl的實現(xiàn)方式6. spring data jpa 查詢自定義字段,轉換為自定義實體方式7. spring data jpa如何只查詢實體部分字段8. Spring Data JPA中 in 條件參數(shù)的傳遞方式9. Spring Data JPA使用JPQL與原生SQL進行查詢的操作10. spring data jpa開啟批量插入、批量更新的問題解析
