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