簡體   English   中英

從存儲過程返回兩個用戶定義類型對象並使用 spring-data-jpa 在存儲庫級別調用存儲過程

[英]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);

UserDefineObjectAUserDefineObjectB都是用戶定義的對象,並且都具有相同的字段,我除外兩個對象都應該從過程中返回。 返回這兩個對象背后有一些業務。

我用@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嘗試了不同的方法。 但問題在於這種方法是我必須將所有這些查詢寫入實體標簽,這增加了更多的復雜性。 我必須創建一個實體並編寫所有存儲過程並調用存儲庫,如下例所示:

如何從java類中獲取用戶定義的SQL過程輸出參數

有沒有更好的方法可以解決這個問題? 我可以在我的類中的方法級別編寫@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);

Github 上的更多示例

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM