Spring Data JPA怎么調(diào)用存儲(chǔ)
Spring Data JPA怎么調(diào)用存儲(chǔ)?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);
相關(guān)文章:
1. Springboot使用Spring Data JPA實(shí)現(xiàn)數(shù)據(jù)庫操作2. 解決spring data jpa 批量保存更新的問題3. 使用Spring Data Jpa的CriteriaQuery一個(gè)陷阱4. Spring Data JPA中 in 條件參數(shù)的傳遞方式5. Spring Data JPA帶條件分頁查詢實(shí)現(xiàn)原理6. spring data jpa開啟批量插入、批量更新的問題解析7. Spring Data JPA 關(guān)鍵字Exists的用法說明8. IDEA 中創(chuàng)建Spring Data Jpa 項(xiàng)目的示例代碼9. spring data jpa 查詢自定義字段,轉(zhuǎn)換為自定義實(shí)體方式10. 在Spring Data JPA中引入Querydsl的實(shí)現(xiàn)方式
