簡體   English   中英

Spring Data JPA NamedStoredProcedureQuery 多個輸出參數

[英]Spring Data JPA NamedStoredProcedureQuery Multiple Out Parameters

我有一個簡單的存儲過程,用於測試 Spring Data JPA 存儲過程功能。

create or replace procedure plus1inout (arg in int,res1 out int,res2 out int) is
BEGIN   
 res1 := arg + 1; 
 res2 := res1 + 1;
END;

我的代碼是:

@Repository
public interface AdjudConverDateSPRepository extends JpaRepository<AdjudConverDateSP, Long> {
    @Procedure(name = "plus1")
    Object[] plus1(@Param("arg") Integer arg);
}

@Entity
@NamedStoredProcedureQuery(name = "plus1", procedureName = "ADJUD.PLUS1INOUT",
        parameters = {
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res1", type = Integer.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res2", type = Integer.class)
})
public class AdjudConverDateSP implements Serializable {
        //stub to satisfy hibernate identifier requirement
        @Id @GeneratedValue
        private Long id;

}

當我只有一個 OUT 參數時,一切正常。 但是一旦我添加了第二個 OUT 參數,我就會收到一個異常,說它在實體中找不到過程。

Caused by:
  org.springframework.data.mapping.PropertyReferenceException: No property plus1 found for type AdjudConverDateSP!  at
  org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:75) at 
  org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:327) at
  org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:307) at
  org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:270) at
  org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:241) at
  org.springframework.data.repository.query.parser.Part.<init>(Part.java:76) at
  org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:235) at
  org.springframework.data.repository.query.parser.PartTree$Predicate.buildTree(PartTree.java:373) at
  org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:353)

看起來@Procedure只需要一個直接綁定到方法返回類型的 OUT 參數...

要處理多個 OUT 參數,您可以直接使用 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");
...

您可以指定使用@Procedure注釋中的outputParameterName參數返回多個輸出參數之一,如下所示:

@Repository
public interface AdjudConverDateSPRepository extends JpaRepository<AdjudConverDateSP, Long> {
    @Procedure(name = "plus1", outputParameterName = "res2")
    Integer plus1(@Param("arg") Integer arg);
}

更新 2019-06-24:

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 返回類型,以便可以通過鍵名訪問每個輸出參數:

@Repository
public interface AdjudConverDateSPRepository extends JpaRepository<AdjudConverDateSP, Long> {
    @Procedure(name = "plus1")
    Map<String, Object> plus1(@Param("arg") Integer arg);
}

Spring 尚不支持多個輸出參數。 為此有一個JIRA

Spring Data JPA 支持多個輸出參數。 Method 的返回類型必須是 Map。 我花了很多時間在這上面。 下面的鏈接正好給出了一個例子,搜索 User.plus1IO2。

用戶.java

用戶存儲庫.java

嗨,基於Jeff Sheets anwer 的人解決了我的問題,所以我也想提供一些幫助

這是我的解決方案

CREATE PROCEDURE `cardById`(IN id int, out cardNumber varchar(16), out personId bigint)
BEGIN
    SELECT card_number, person_id into cardNumber, personId 
    FROM cards 
    WHERE card_number = id
    LIMIT 1;
END

在實體類中

@NamedStoredProcedureQuery(name = "Card.cardById",
    procedureName = "cardById", parameters = {
    @StoredProcedureParameter(mode = ParameterMode.IN, name = "id", type = String.class),
    @StoredProcedureParameter(mode = ParameterMode.OUT, name = "cardNumber", type = String.class),
    @StoredProcedureParameter(mode = ParameterMode.OUT, name = "personId", type = Long.class)

在存儲庫中

@Procedure(name = "Card.cardById")
Map<String, Object> cardById(String id);

快樂編碼!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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