Skip to content

Commit 8c0e045

Browse files
committed
Fix named procedure return value retrieval for named procedures.
We assume that if a stored procedure is named (associated with the Persitence Context) that we can access its out values by name. Closes #1759
1 parent 1bee600 commit 8c0e045

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/StoredProcedureJpaQuery.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@
1515
*/
1616
package org.springframework.data.jpa.repository.query;
1717

18-
import java.util.HashMap;
19-
import java.util.List;
20-
import java.util.Map;
21-
2218
import jakarta.persistence.EntityManager;
2319
import jakarta.persistence.NamedStoredProcedureQuery;
2420
import jakarta.persistence.ParameterMode;
2521
import jakarta.persistence.StoredProcedureQuery;
2622
import jakarta.persistence.TypedQuery;
2723

24+
import java.util.HashMap;
25+
import java.util.List;
26+
import java.util.Map;
27+
2828
import org.springframework.data.jpa.repository.query.JpaParameters.JpaParameter;
2929
import org.springframework.data.repository.query.Parameter;
3030
import org.springframework.data.repository.query.QueryMethod;
@@ -138,11 +138,17 @@ Object extractOutputValue(StoredProcedureQuery storedProcedureQuery) {
138138
* @return The value of an output parameter either by name or by index.
139139
*/
140140
private Object extractOutputParameterValue(ProcedureParameter outputParameter,
141-
StoredProcedureQuery storedProcedureQuery) {
141+
StoredProcedureQuery query) {
142+
143+
if (procedureAttributes.isNamedStoredProcedure() && StringUtils.hasText(outputParameter.getName())) {
144+
145+
return StringUtils.hasText(outputParameter.getName()) ? query.getOutputParameterValue(outputParameter.getName())
146+
: query.getOutputParameterValue(outputParameter.getPosition());
147+
}
142148

143149
return useNamedParameters && StringUtils.hasText(outputParameter.getName())
144-
? storedProcedureQuery.getOutputParameterValue(outputParameter.getName())
145-
: storedProcedureQuery.getOutputParameterValue(outputParameter.getPosition());
150+
? query.getOutputParameterValue(outputParameter.getName())
151+
: query.getOutputParameterValue(outputParameter.getPosition());
146152
}
147153

148154
/**

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/procedures/PostgresStoredProcedureIntegrationTests.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package org.springframework.data.jpa.repository.procedures;
1818

19-
import static org.assertj.core.api.Assertions.assertThat;
19+
import static org.assertj.core.api.Assertions.*;
2020

2121
import jakarta.persistence.Entity;
2222
import jakarta.persistence.EntityManagerFactory;
@@ -38,6 +38,7 @@
3838
import org.junit.jupiter.api.Test;
3939
import org.junit.jupiter.api.extension.ExtendWith;
4040
import org.postgresql.ds.PGSimpleDataSource;
41+
4142
import org.springframework.beans.factory.annotation.Autowired;
4243
import org.springframework.context.annotation.Bean;
4344
import org.springframework.context.annotation.ComponentScan.Filter;
@@ -58,6 +59,7 @@
5859
import org.springframework.transaction.PlatformTransactionManager;
5960
import org.springframework.transaction.annotation.EnableTransactionManagement;
6061
import org.springframework.transaction.annotation.Transactional;
62+
6163
import org.testcontainers.containers.PostgreSQLContainer;
6264

6365
/**
@@ -165,6 +167,11 @@ void testPositionalInOutParameter() {
165167
procedureName = "get_employees", //
166168
parameters = { @StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, type = void.class) }, //
167169
resultClasses = Employee.class)
170+
171+
@NamedStoredProcedureQuery( //
172+
name = "Employee.noResultSet", //
173+
procedureName = "get_employees_count", //
174+
parameters = { @StoredProcedureParameter(mode = ParameterMode.OUT, name = "results", type = Integer.class) })
168175
@NamedStoredProcedureQuery( //
169176
name = "positional_inout", //
170177
procedureName = "positional_inout_parameter_issue3460", //

0 commit comments

Comments
 (0)