![](/img/trans.png)
[英]@NamedStoredProcedureQuery with Spring Data JPA Repository - Type cannot be null error
[英]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。
嗨,基於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.