J'utilise une procédure stockée simple pour tester la fonctionnalité de procédure stockée JPA de Spring Data.
create or replace procedure plus1inout (arg in int,res1 out int,res2 out int) is
BEGIN
res1 := arg + 1;
res2 := res1 + 1;
END;
Mon code est:
@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;
}
Tout fonctionne bien quand j'ai un seul paramètre OUT. Mais une fois que j’ajoute un deuxième paramètre OUT, une exception me dit qu’elle ne trouve pas la procédure dans l’entité.
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)
Il semble que @Procedure
n'attend qu'un paramètre OUT directement lié au type de retour de la méthode ...
Pour gérer plusieurs paramètres OUT, vous pouvez utiliser directement l'API JPA:
StoredProcedureQuery proc = em.createNamedStoredProcedureQuery("plus1");
proc.setParameter("arg", 1);
proc.execute();
Integer res1 = (Integer) proc.getOutputParameterValue("res1");
Integer res2 = (Integer) proc.getOutputParameterValue("res2");
...
Spring ne prend pas encore en charge plusieurs paramètres. Il y a un JIRA pour cela.
Vous pouvez spécifier de renvoyer l'un des multiples paramètres out avec le paramètre outputParameterName
dans l'annotation @Procedure
, comme suit:
@Repository
public interface AdjudConverDateSPRepository extends JpaRepository<AdjudConverDateSP, Long> {
@Procedure(name = "plus1", outputParameterName = "res2")
Integer plus1(@Param("arg") Integer arg);
}
Mais malheureusement, comme mentionné dans d'autres commentaires, le retour de tous les paramètres n'est pas encore implémenté