[英]Returning two user define type object from stored procedure and calling stored procedure at repository level using spring-data-jpa
我有一個存儲過程,定義如下:
PROCEDURE TestABC (tableName IN VARCHAR2, cardID IN VARCHAR2, detail OUT UserDefineObjectA, td OUT UserDefineObjectB);
UserDefineObjectA
, UserDefineObjectB
都是用戶定義的對象,並且都具有相同的字段,我除外兩個對象都應該從過程中返回。 返回這兩個對象背后有一些業務。
我用@Repository
注釋編寫了方法類,它具有以下方法。 我正在使用spring-data -jpa
@Procedure
注釋。 當前實現@Procedure
只能采用一個outputParameterName
。 但是對於我的情況,我除了返回兩個用戶定義類型的對象。
@Procedure(procedureName = "TestABC" , outputParameterName = "{UserDefineObjectA, UserDefineObjectB}")
public List<Object[]> getAllDetails(@Param("tableName") String tableName, @Param("cardID ") String cardID);
然后,我使用@NamedStoredProcedureQuery
嘗試了不同的方法。 但問題在於這種方法是我必須將所有這些查詢寫入實體標簽,這增加了更多的復雜性。 我必須創建一個實體並編寫所有存儲過程並調用存儲庫,如下例所示:
有沒有更好的方法可以解決這個問題? 我可以在我的類中的方法級別編寫@NamedStoredProcedureQuery
,它被注釋為@Repository
。
我試圖實現的遺留代碼示例。
callableStatement = connection.prepareCall("{call ABC(?,?,?,?)}");
callableStatement.setString(1, "test");
callableStatement.setString(2, "12345679090978");
callableStatement.registerOutParameter(3, Types.ARRAY, AConstants.UserDefineObjectA);
callableStatement.registerOutParameter(4, Types.STRUCT, AConstants.UserDefineObjectB);
callableStatement.execute();
return (Object[]) ((java.sql.Array) callableStatement.getObject(3)).getArray();
我認為有兩種方法可以解決這個問題。
1.更新Spring Data JPA版本
從 Spring Data JPA 2.2-RC1 開始支持多個輸出參數。
https://spring.io/blog/2019/06/17/spring-data-moore-rc1-and-lovelace-sr9-released
https://jira.spring.io/browse/DATAJPA-707
接口方法只需要有一個 Map 返回類型,以便可以通過鍵名訪問每個輸出參數:
/**
* Explicitly mapped to named stored procedure "User.plus1IOoptional" in {@link EntityManager}.
* Returns 2 out params
* as a Map, second one amoung which is null.
*/
@Procedure(name = "User.plus1IOoptional") // DATAJPA-1579
Map<String, Integer> entityAnnotatedCustomNamedProcedurePlus1IOoptional(@Param("arg") Integer arg);
2.直接使用JPA API,通過稍微復雜一點
StoredProcedureQuery proc = em.createNamedStoredProcedureQuery("plus1");
proc.setParameter("arg", 1);
proc.execute();
Integer res1 = (Integer) proc.getOutputParameterValue("res1");
Integer res2 = (Integer) proc.getOutputParameterValue("res2");
我希望它會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.