23

Ich habe eine einfache gespeicherte Prozedur, die ich verwende, um Spring Data JPA Stored Procedure-Funktion zu testen.Spring-Daten JPA NamedStoredProcedureQuery Mehrere Out-Parameter

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

Mein Code ist:

@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; 

} 

Alles funktioniert gut, wenn ich einen einzelnen Parameter OUT haben. Aber sobald ich einen zweiten OUT-Parameter hinzufüge, bekomme ich eine Ausnahme, die besagt, dass die Prozedur in der Entität nicht gefunden werden kann.

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

Welche Spring Data JPA-Version verwenden Sie? –

+0

Spring-Data JPA Version 1.8.0 –

+0

Es gibt ein Problem in der Git-Repo für diese https://github.com/spring-projects/spring-data-examples/issues/80 ... das wäre die Antwort, wenn sie geh zu ihm. –

Antwort

5

Es sieht aus wie @Procedure nur ein OUT-Parameter erwartet, der direkt mit der Methode Rückgabetyp binded ist ...

Um mehrere OUT params umgehen können Sie die JPA-API verwenden, um direkt:

StoredProcedureQuery proc = em.createNamedStoredProcedureQuery("plus1"); 

proc.setParameter("arg", 1); 
proc.execute(); 
Integer res1 = (Integer) proc.getOutputParameterValue("res1"); 
Integer res2 = (Integer) proc.getOutputParameterValue("res2"); 
... 
+0

zu ersetzen. Letztendlich benutze ich die JPA API, was ich getan habe. Wo hast du herausgefunden, dass @Procedure nur einen OUT-Parameter erwartet? –

+1

Die API ausgenommen nur einen OUT-Parameter http://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/query/Procedure.html –

+0

können Sie bitte angeben vollständiges Beispiel. Ich bin neu und nicht in der Lage, Named Stored-Prozedur über Entitätsmanager aufzurufen. –

Verwandte Themen