stored query namedstoredprocedurequery namedstoredprocedurequeries example data java hibernate stored-procedures spring-data spring-data-jpa

java - namedstoredprocedurequeries - Spring Data JPA NamedStoredProcedureQuery Parámetros de salida múltiple



jpa stored procedure parameters (2)

Tengo un procedimiento almacenado simple que estoy usando para probar la función del Procedimiento almacenado 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;

Mi código es:

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

Todo funciona bien cuando tengo un único parámetro OUT. Pero una vez que agrego un segundo parámetro OUT, aparece una excepción que dice que no puede encontrar el procedimiento en la entidad.

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)


Parece que @Procedure solo espera un parámetro OUT que esté enlazado directamente al tipo de retorno del método ...

Para gestionar múltiples parámetros OUT, puede usar la API JPA directamente:

StoredProcedureQuery proc = em.createNamedStoredProcedureQuery("plus1"); proc.setParameter("arg", 1); proc.execute(); Integer res1 = (Integer) proc.getOutputParameterValue("res1"); Integer res2 = (Integer) proc.getOutputParameterValue("res2"); ...


Spring aún no admite múltiples parámetros. Hay una JIRA para esto.