23

У меня есть простая хранимая процедура, которую я использую для проверки функции хранимых процедур Spring Data JPA.Весенние данные JPA NamedStoredProcedureQuery Множественные параметры вывода

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, я получаю исключение, говоря, что он не может найти процедуру в сущности.

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) 
+0

Какую версию JPA для данных Spring вы используете? –

+0

Spring-Data JPA версия 1.8.0 –

+0

В git repo есть проблема в этом https://github.com/spring-projects/spring-data-examples/issues/80 ... это было бы ответом, когда они добирайся до него. –

ответ

5

Похоже @Procedure ожидает параметр только один OUT, который привязываться непосредственно к типу метод обратного ...

Чтобы работать с несколькими OUT Params вы можете использовать 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"); 
... 
+0

В конечном счете использование JPA API - это то, что я сделал. Где вы обнаружили, что @Procedure ожидает только одного параметра OUT? –

+1

API исключает только один параметр OUT http://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/query/Procedure.html –

+0

, можете ли вы предоставить полный пример. Я новичок и не могу вызвать Named Stored процедуру через диспетчер сущностей. –

Смежные вопросы