doCreateCountQuery(JpaParametersParameterAccessor accessor) {
- throw new UnsupportedOperationException("StoredProcedureQuery does not support count queries!");
- }
-
- /**
- * Extracts the output value from the given {@link StoredProcedureQuery}.
- *
- * @param storedProcedureQuery must not be {@literal null}.
- *
- * Result is either a single value, or a Map> of output parameter names to nullable
- * values
- */
- @Nullable
- Object extractOutputValue(StoredProcedureQuery storedProcedureQuery) {
-
- Assert.notNull(storedProcedureQuery, "StoredProcedureQuery must not be null!");
-
- if (!procedureAttributes.hasReturnValue()) {
- return null;
- }
-
- Map outputValues = new HashMap<>();
- List parameterNames = procedureAttributes.getOutputParameterNames();
-
- for (int i = 0; i < parameterNames.size(); i++) {
-
- String name = parameterNames.get(i);
- outputValues.put(name, extractOutputParameter(storedProcedureQuery, i));
- }
-
- return outputValues.size() == 1 ? outputValues.values().iterator().next() : outputValues;
- }
-
- private Object extractOutputParameter(StoredProcedureQuery storedProcedureQuery, Integer index) {
-
- String outputParameterName = procedureAttributes.getOutputParameterNames().get(index);
- JpaParameters parameters = getQueryMethod().getParameters();
-
- return extractOutputParameterValue(storedProcedureQuery, outputParameterName, index,
- parameters.getNumberOfParameters());
- }
-
- /**
- * extract the value of an output parameter either by name or by index.
- *
- * @param storedProcedureQuery the query object of the stored procedure.
- * @param name the name of the output parameter
- * @param index index of the output parameter
- * @param offset for index based access the index after which to find the output parameter values
- * @return the value
- */
- private Object extractOutputParameterValue(StoredProcedureQuery storedProcedureQuery, String name, Integer index,
- int offset) {
-
- return useNamedParameters && StringUtils.hasText(name) ? //
- storedProcedureQuery.getOutputParameterValue(name)
- : storedProcedureQuery.getOutputParameterValue(offset + index + 1);
- }
-
- /**
- * Creates a new JPA 2.1 {@link StoredProcedureQuery} from this {@link StoredProcedureJpaQuery}.
- */
- private StoredProcedureQuery createStoredProcedure() {
-
- return procedureAttributes.isNamedStoredProcedure() ? newNamedStoredProcedureQuery()
- : newAdhocStoredProcedureQuery();
- }
-
- /**
- * Creates a new named {@link StoredProcedureQuery} defined via an {@link NamedStoredProcedureQuery} on an entity.
- */
- private StoredProcedureQuery newNamedStoredProcedureQuery() {
- return getEntityManager().createNamedStoredProcedureQuery(procedureAttributes.getProcedureName());
- }
-
- /**
- * Creates a new ad-hoc {@link StoredProcedureQuery} from the given {@link StoredProcedureAttributes}.
- */
- private StoredProcedureQuery newAdhocStoredProcedureQuery() {
-
- JpaParameters params = getQueryMethod().getParameters();
- String procedureName = procedureAttributes.getProcedureName();
-
- StoredProcedureQuery procedureQuery = getEntityManager().createStoredProcedureQuery(procedureName);
-
- for (JpaParameter param : params) {
-
- if (!param.isBindable()) {
- continue;
- }
-
- if (useNamedParameters) {
- procedureQuery.registerStoredProcedureParameter(
- param.getName()
- .orElseThrow(() -> new IllegalArgumentException(ParameterBinder.PARAMETER_NEEDS_TO_BE_NAMED)),
- param.getType(), ParameterMode.IN);
- } else {
- procedureQuery.registerStoredProcedureParameter(param.getIndex() + 1, param.getType(), ParameterMode.IN);
- }
- }
-
- if (procedureAttributes.hasReturnValue()) {
-
- ParameterMode mode = ParameterMode.OUT;
-
- IntStream.range(0, procedureAttributes.getOutputParameterTypes().size()).forEach(i -> {
- Class> outputParameterType = procedureAttributes.getOutputParameterTypes().get(i);
-
- if (useNamedParameters) {
-
- String outputParameterName = procedureAttributes.getOutputParameterNames().get(i);
- procedureQuery.registerStoredProcedureParameter(outputParameterName, outputParameterType, mode);
+ private final StoredProcedureAttributes procedureAttributes;
+ private final boolean useNamedParameters;
+ private final QueryParameterSetter.QueryMetadataCache metadataCache = new QueryParameterSetter.QueryMetadataCache();
+
+ /**
+ * Creates a new {@link StoredProcedureJpaQuery}.
+ *
+ * @param method must not be {@literal null}
+ * @param em must not be {@literal null}
+ */
+ StoredProcedureJpaQuery(JpaQueryMethod method, EntityManager em) {
+
+ super(method, em);
+ this.procedureAttributes = method.getProcedureAttributes();
+ this.useNamedParameters = useNamedParameters(method);
+
+ }
+
+ /**
+ * Determine whether to used named parameters for the given query method.
+ *
+ * @param method must not be {@literal null}.
+ */
+ private static boolean useNamedParameters(QueryMethod method) {
+
+ for (Parameter parameter : method.getParameters()) {
+ if (parameter.isNamedParameter()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.jpa.repository.query.AbstractJpaQuery#createQuery(JpaParametersParameterAccessor)
+ */
+ @Override
+ protected StoredProcedureQuery createQuery(JpaParametersParameterAccessor accessor) {
+ return applyHints(doCreateQuery(accessor), getQueryMethod());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.jpa.repository.query.AbstractJpaQuery#doCreateQuery(JpaParametersParameterAccessor)
+ */
+ @Override
+ protected StoredProcedureQuery doCreateQuery(JpaParametersParameterAccessor accessor) {
+
+ StoredProcedureQuery storedProcedure = createStoredProcedure();
+ QueryParameterSetter.QueryMetadata metadata = metadataCache.getMetadata("singleton", storedProcedure);
+
+ return parameterBinder.get().bind(storedProcedure, metadata, accessor);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.jpa.repository.query.AbstractJpaQuery#doCreateCountQuery(JpaParametersParameterAccessor)
+ */
+ @Override
+ protected TypedQuery doCreateCountQuery(JpaParametersParameterAccessor accessor) {
+ throw new UnsupportedOperationException("StoredProcedureQuery does not support count queries!");
+ }
+
+ /**
+ * Extracts the output value from the given {@link StoredProcedureQuery}.
+ *
+ * @param storedProcedureQuery must not be {@literal null}.
+ *
+ * Result is either a single value, or a Map> of output parameter names to nullable
+ * values
+ */
+ @Nullable
+ Object extractOutputParametersValues(StoredProcedureQuery storedProcedureQuery) {
+
+ Assert.notNull(storedProcedureQuery, "StoredProcedureQuery must not be null!");
+
+ if (!procedureAttributes.hasReturnValue()) {
+ return null;
+ }
+
+ List outputParameters = procedureAttributes.getOutputProcedureParameters();
+
+ if (outputParameters.size() == 1) {
+ return extractOutputParameterValue(outputParameters.get(0), 0, storedProcedureQuery);
+ }
+
+ Map outputValues = new HashMap<>();
+
+ for (int i = 0; i < outputParameters.size(); i++) {
+ ProcedureParameter outputParameter = outputParameters.get(i);
+ outputValues.put(outputParameter.getName(), extractOutputParameterValue(outputParameter, i, storedProcedureQuery));
+ }
+
+ return outputValues;
+ }
+
+ /**
+ * @return The value of an output parameter either by name or by index.
+ */
+ private Object extractOutputParameterValue(ProcedureParameter outputParameter, Integer index, StoredProcedureQuery storedProcedureQuery) {
+
+ JpaParameters methodParameters = getQueryMethod().getParameters();
+
+ return useNamedParameters && StringUtils.hasText(outputParameter.getName()) ?
+ storedProcedureQuery.getOutputParameterValue(outputParameter.getName())
+ : storedProcedureQuery.getOutputParameterValue(methodParameters.getNumberOfParameters() + index + 1);
+ }
+
+ /**
+ * Creates a new JPA 2.1 {@link StoredProcedureQuery} from this {@link StoredProcedureJpaQuery}.
+ */
+ private StoredProcedureQuery createStoredProcedure() {
+
+ return procedureAttributes.isNamedStoredProcedure() ? newNamedStoredProcedureQuery()
+ : newAdHocSingleResultProcedureQuery();
+ }
+
+ /**
+ * Creates a new named {@link StoredProcedureQuery} defined via an {@link NamedStoredProcedureQuery} on an entity.
+ */
+ private StoredProcedureQuery newNamedStoredProcedureQuery() {
+ return getEntityManager().createNamedStoredProcedureQuery(procedureAttributes.getProcedureName());
+ }
+
+ /**
+ * Creates a new ad-hoc {@link StoredProcedureQuery} from the given {@link StoredProcedureAttributes}.
+ */
+ private StoredProcedureQuery newAdHocSingleResultProcedureQuery() {
+
+ JpaParameters params = getQueryMethod().getParameters();
+ StoredProcedureQuery procedureQuery = createAdhocSingleResultProcedureQuery();
+
+ for (JpaParameter param : params) {
+
+ if (!param.isBindable()) {
+ continue;
+ }
+
+ if (useNamedParameters) {
+ procedureQuery.registerStoredProcedureParameter(
+ param.getName()
+ .orElseThrow(() -> new IllegalArgumentException(ParameterBinder.PARAMETER_NEEDS_TO_BE_NAMED)),
+ param.getType(), ParameterMode.IN);
+ } else {
+ procedureQuery.registerStoredProcedureParameter(param.getIndex() + 1, param.getType(), ParameterMode.IN);
+ }
+ }
+
+ if (procedureAttributes.hasReturnValue()) {
+
+ ProcedureParameter procedureOutput = procedureAttributes.getOutputProcedureParameters().get(0);
+
+ if (useNamedParameters) {
+ procedureQuery.registerStoredProcedureParameter(procedureOutput.getName(), procedureOutput.getType(), procedureOutput.getMode());
+ } else {
+ // Output parameter should be after the input parameters
+ int outputParameterIndex = params.getNumberOfParameters() + 1;
+ procedureQuery.registerStoredProcedureParameter(outputParameterIndex, procedureOutput.getType(),
+ procedureOutput.getMode());
+ }
+ }
+
+ return procedureQuery;
+ }
+
+ private StoredProcedureQuery createAdhocSingleResultProcedureQuery() {
+ String procedureName = procedureAttributes.getProcedureName();
+
+ if (getQueryMethod().isQueryForEntity()) {
- } else {
- procedureQuery.registerStoredProcedureParameter(params.getNumberOfParameters() + i + 1, outputParameterType,
- mode);
- }
- });
- }
+ return getEntityManager().createStoredProcedureQuery(procedureName,
+ getQueryMethod().getEntityInformation().getJavaType());
+ }
- return procedureQuery;
- }
+ return getEntityManager().createStoredProcedureQuery(procedureName);
+ }
}
diff --git a/src/main/java/org/springframework/data/jpa/repository/support/JpaRepositoryFactory.java b/src/main/java/org/springframework/data/jpa/repository/support/JpaRepositoryFactory.java
index 7b1d0305c9..501f76b68a 100644
--- a/src/main/java/org/springframework/data/jpa/repository/support/JpaRepositoryFactory.java
+++ b/src/main/java/org/springframework/data/jpa/repository/support/JpaRepositoryFactory.java
@@ -33,10 +33,7 @@
import org.springframework.data.jpa.provider.PersistenceProvider;
import org.springframework.data.jpa.provider.QueryExtractor;
import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.query.AbstractJpaQuery;
-import org.springframework.data.jpa.repository.query.EscapeCharacter;
-import org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy;
-import org.springframework.data.jpa.repository.query.JpaQueryMethod;
+import org.springframework.data.jpa.repository.query.*;
import org.springframework.data.jpa.util.JpaMetamodel;
import org.springframework.data.projection.ProjectionFactory;
import org.springframework.data.querydsl.EntityPathResolver;
@@ -92,7 +89,7 @@ public JpaRepositoryFactory(EntityManager entityManager) {
addRepositoryProxyPostProcessor(crudMethodMetadataPostProcessor);
addRepositoryProxyPostProcessor((factory, repositoryInformation) -> {
- if (hasMethodReturningStream(repositoryInformation.getRepositoryInterface())) {
+ if (isTransactionNeeded(repositoryInformation.getRepositoryInterface())) {
factory.addAdvice(SurroundingTransactionDetectorMethodInterceptor.INSTANCE);
}
});
@@ -241,12 +238,13 @@ protected RepositoryComposition.RepositoryFragments getRepositoryFragments(Repos
return fragments;
}
- private static boolean hasMethodReturningStream(Class> repositoryClass) {
+ private static boolean isTransactionNeeded(Class> repositoryClass) {
Method[] methods = ReflectionUtils.getAllDeclaredMethods(repositoryClass);
for (Method method : methods) {
- if (Stream.class.isAssignableFrom(method.getReturnType())) {
+ if (Stream.class.isAssignableFrom(method.getReturnType()) ||
+ method.isAnnotationPresent(Procedure.class)) {
return true;
}
}
diff --git a/src/test/java/org/springframework/data/jpa/domain/sample/Dummy.java b/src/test/java/org/springframework/data/jpa/domain/sample/Dummy.java
index 5b82c15537..b672fc8d24 100644
--- a/src/test/java/org/springframework/data/jpa/domain/sample/Dummy.java
+++ b/src/test/java/org/springframework/data/jpa/domain/sample/Dummy.java
@@ -46,12 +46,12 @@
type = Integer.class) }) //
,
@NamedStoredProcedureQuery(name = "Dummy.procedureWith1InputAnd1OutputParameterWithResultSet",
- procedureName = "procedure_in1_out0_return_rs_no_update", parameters = {
+ procedureName = "procedure_in1_out0_return_ref_cursor_no_update", parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, type = String.class),
@StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, type = void.class) }) //
,
@NamedStoredProcedureQuery(name = "Dummy.procedureWith1InputAnd1OutputParameterWithResultSetWithUpdate",
- procedureName = "procedure_in1_out0_return_rs_with_update", parameters = {
+ procedureName = "procedure_in1_out0_return_ref_cursor_with_update", parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, type = String.class),
@StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, type = void.class) }) //
,
diff --git a/src/test/java/org/springframework/data/jpa/repository/StoredProcedureIntegrationTests.java b/src/test/java/org/springframework/data/jpa/repository/StoredProcedureIntegrationTests.java
index 7065af25fc..7f1d48a2ee 100644
--- a/src/test/java/org/springframework/data/jpa/repository/StoredProcedureIntegrationTests.java
+++ b/src/test/java/org/springframework/data/jpa/repository/StoredProcedureIntegrationTests.java
@@ -46,6 +46,7 @@
* @author Thomas Darimont
* @author Oliver Gierke
* @author Jens Schauder
+ * @author Gabriel Basilio
* @see scripts/schema-stored-procedures.sql for procedure definitions.
*/
@Transactional
@@ -53,7 +54,7 @@
@RunWith(SpringJUnit4ClassRunner.class)
public class StoredProcedureIntegrationTests {
- private static final String NOT_SUPPORTED = "Stored procedures with ResultSets are currently not supported for any JPA provider";
+ private static final String NOT_SUPPORTED = "Stored procedures with REF_CURSOR are currently not supported by HSQL dialect";
@PersistenceContext EntityManager em;
@Autowired DummyRepository repository;
@@ -80,9 +81,9 @@ public void shouldExecuteAdHocProcedureWith1InputAndNoOutputParameter() {
@Test // DATAJPA-652
@Ignore(NOT_SUPPORTED)
- public void shouldExecuteAdHocProcedureWith1InputAnd1OutputParameterWithResultSet() {
+ public void shouldExecuteAdHocProcedureWith1InputAnd1OutputParameterWithRefCursor() {
- List dummies = repository.adHocProcedureWith1InputAnd1OutputParameterWithResultSet("FOO");
+ List dummies = repository.adHocProcedureWith1InputAnd1OutputParameterWithRefCursor("FOO");
assertThat(dummies).isNotNull();
assertThat(dummies.size()).isEqualTo(3);
@@ -90,9 +91,9 @@ public void shouldExecuteAdHocProcedureWith1InputAnd1OutputParameterWithResultSe
@Test // DATAJPA-652
@Ignore(NOT_SUPPORTED)
- public void shouldExecuteAdHocProcedureWith1InputAnd1OutputParameterWithResultSetWithUpdate() {
+ public void shouldExecuteAdHocProcedureWith1InputAnd1OutputParameterWithRefCursorWithUpdate() {
- List dummies = repository.adHocProcedureWith1InputAnd1OutputParameterWithResultSetWithUpdate("FOO");
+ List dummies = repository.adHocProcedureWith1InputAnd1OutputParameterWithRefCursorWithUpdate("FOO");
assertThat(dummies).isNotNull();
assertThat(dummies.size()).isEqualTo(3);
diff --git a/src/test/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributeSourceUnitTests.java b/src/test/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributeSourceUnitTests.java
index ad6ddd72e5..231254dcaa 100644
--- a/src/test/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributeSourceUnitTests.java
+++ b/src/test/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributeSourceUnitTests.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2014-2019 the original author or authors.
+ * Copyright 2014-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,14 +21,17 @@
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.core.annotation.AliasFor;
+import org.springframework.data.jpa.domain.sample.Dummy;
import org.springframework.data.jpa.domain.sample.User;
import org.springframework.data.repository.query.Param;
import org.springframework.util.ReflectionUtils;
import javax.persistence.EntityManager;
+import javax.persistence.ParameterMode;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
+import java.util.List;
import java.util.Map;
import static org.assertj.core.api.Assertions.*;
@@ -43,235 +46,382 @@
* @author Diego Diez
* @author Jeff Sheets
* @author Jens Schauder
+ * @author Gabriel Basilio
* @since 1.6
*/
@RunWith(MockitoJUnitRunner.class)
public class StoredProcedureAttributeSourceUnitTests {
- StoredProcedureAttributeSource creator;
- @Mock
- JpaEntityMetadata entityMetadata;
+ StoredProcedureAttributeSource creator;
+ @Mock
+ JpaEntityMetadata entityMetadata;
+
+ @Before
+ public void setup() {
+
+ creator = StoredProcedureAttributeSource.INSTANCE;
- @Before
- public void setup() {
+ when(entityMetadata.getJavaType()).thenReturn(User.class);
+ when(entityMetadata.getEntityName()).thenReturn("User");
+ }
- creator = StoredProcedureAttributeSource.INSTANCE;
+ @Test // DATAJPA-455
+ public void shouldCreateStoredProcedureAttributesFromProcedureMethodWithImplicitProcedureName() {
- when(entityMetadata.getJavaType()).thenReturn(User.class);
- when(entityMetadata.getEntityName()).thenReturn("User");
- }
+ StoredProcedureAttributes attr = creator.createFrom(method("plus1inout", Integer.class), entityMetadata);
+ ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
+ assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
+ assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(outputParameter.getType()).isEqualTo(Integer.class);
+ assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
+ }
- @Test // DATAJPA-455
- public void shouldCreateStoredProcedureAttributesFromProcedureMethodWithImplicitProcedureName() {
+ @Test // DATAJPA-455
+ public void shouldCreateStoredProcedureAttributesFromProcedureMethodWithExplictName() {
- StoredProcedureAttributes attr = creator.createFrom(method("plus1inout", Integer.class), entityMetadata);
+ StoredProcedureAttributes attr = creator.createFrom(method("explicitlyNamedPlus1inout", Integer.class),
+ entityMetadata);
- assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
- assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
- assertThat(attr.getOutputParameterNames().get(0)).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
- }
+ ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
+ assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
+ assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(outputParameter.getType()).isEqualTo(Integer.class);
+ assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
+ }
- @Test // DATAJPA-455
- public void shouldCreateStoredProcedureAttributesFromProcedureMethodWithExplictName() {
+ @Test // DATAJPA-455
+ public void shouldCreateStoredProcedureAttributesFromProcedureMethodWithExplictProcedureNameValue() {
- StoredProcedureAttributes attr = creator.createFrom(method("explicitlyNamedPlus1inout", Integer.class),
- entityMetadata);
+ StoredProcedureAttributes attr = creator.createFrom(method("explicitlyNamedPlus1inout", Integer.class),
+ entityMetadata);
- assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
- assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
- assertThat(attr.getOutputParameterNames().get(0)).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
- }
+ ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
+ assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
+ assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(outputParameter.getType()).isEqualTo(Integer.class);
+ assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
+ }
- @Test // DATAJPA-455
- public void shouldCreateStoredProcedureAttributesFromProcedureMethodWithExplictProcedureNameValue() {
+ @Test // DATAJPA-455
+ public void shouldCreateStoredProcedureAttributesFromProcedureMethodWithExplictProcedureNameAlias() {
- StoredProcedureAttributes attr = creator.createFrom(method("explicitlyNamedPlus1inout", Integer.class),
- entityMetadata);
+ StoredProcedureAttributes attr = creator
+ .createFrom(method("explicitPlus1inoutViaProcedureNameAlias", Integer.class), entityMetadata);
- assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
- assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
- assertThat(attr.getOutputParameterNames().get(0)).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
- }
+ ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
+ assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
+ assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(outputParameter.getType()).isEqualTo(Integer.class);
+ assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
+ }
- @Test // DATAJPA-455
- public void shouldCreateStoredProcedureAttributesFromProcedureMethodWithExplictProcedureNameAlias() {
+ @Test // DATAJPA-1297
+ public void shouldCreateStoredProcedureAttributesFromProcedureMethodWithExplictProcedureNameAliasAndOutputParameterName() {
- StoredProcedureAttributes attr = creator
- .createFrom(method("explicitPlus1inoutViaProcedureNameAlias", Integer.class), entityMetadata);
+ StoredProcedureAttributes attr = creator.createFrom(
+ method("explicitPlus1inoutViaProcedureNameAliasAndOutputParameterName", Integer.class), entityMetadata);
- assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
- assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
- assertThat(attr.getOutputParameterNames().get(0)).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
- }
+ ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
+ assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
+ assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(outputParameter.getType()).isEqualTo(Integer.class);
+ assertThat(outputParameter.getName()).isEqualTo("res");
+ }
- @Test // DATAJPA-1297
- public void shouldCreateStoredProcedureAttributesFromProcedureMethodWithExplictProcedureNameAliasAndOutputParameterName() {
+ @Test // DATAJPA-455
+ public void shouldCreateStoredProcedureAttributesFromProcedureMethodBackedWithExplicitlyNamedProcedure() {
- StoredProcedureAttributes attr = creator.createFrom(
- method("explicitPlus1inoutViaProcedureNameAliasAndOutputParameterName", Integer.class), entityMetadata);
+ StoredProcedureAttributes attr = creator
+ .createFrom(method("entityAnnotatedCustomNamedProcedurePlus1IO", Integer.class), entityMetadata);
- assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
- assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
- assertThat(attr.getOutputParameterNames().get(0)).isEqualTo("res");
- }
+ ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
+ assertThat(attr.getProcedureName()).isEqualTo("User.plus1IO");
+ assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(outputParameter.getType()).isEqualTo(Integer.class);
+ assertThat(outputParameter.getName()).isEqualTo("res");
+ }
- @Test // DATAJPA-455
- public void shouldCreateStoredProcedureAttributesFromProcedureMethodBackedWithExplicitlyNamedProcedure() {
+ @Test // DATAJPA-707
+ public void shouldCreateStoredProcedureAttributesFromProcedureMethodBackedWithExplicitlyNamedProcedureAndOutputParamName() {
- StoredProcedureAttributes attr = creator
- .createFrom(method("entityAnnotatedCustomNamedProcedurePlus1IO", Integer.class), entityMetadata);
+ StoredProcedureAttributes attr = creator
+ .createFrom(method("entityAnnotatedCustomNamedProcedureOutputParamNamePlus1IO", Integer.class), entityMetadata);
- assertThat(attr.getProcedureName()).isEqualTo("User.plus1IO");
- assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
- assertThat(attr.getOutputParameterNames().get(0)).isEqualTo("res");
- }
-
- @Test // DATAJPA-707
- public void shouldCreateStoredProcedureAttributesFromProcedureMethodBackedWithExplicitlyNamedProcedureAndOutputParamName() {
-
- StoredProcedureAttributes attr = creator
- .createFrom(method("entityAnnotatedCustomNamedProcedureOutputParamNamePlus1IO", Integer.class), entityMetadata);
-
- assertThat(attr.getProcedureName()).isEqualTo("User.plus1IO");
- assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
- assertThat(attr.getOutputParameterNames().get(0)).isEqualTo("override");
- }
-
- @Test // DATAJPA-707
- public void shouldCreateStoredProcedureAttributesFromProcedureMethodBackedWithExplicitlyNamedProcedureAnd2OutParams() {
-
- StoredProcedureAttributes attr = creator
- .createFrom(method("entityAnnotatedCustomNamedProcedurePlus1IO2", Integer.class), entityMetadata);
-
- assertThat(attr.getProcedureName()).isEqualTo("User.plus1IO2");
- assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
- assertThat(attr.getOutputParameterNames().get(0)).isEqualTo("res");
- assertThat(attr.getOutputParameterTypes().get(1)).isEqualTo(Integer.class);
- assertThat(attr.getOutputParameterNames().get(1)).isEqualTo("res2");
- }
-
- @Test // DATAJPA-455
- public void shouldCreateStoredProcedureAttributesFromProcedureMethodBackedWithImplicitlyNamedProcedure() {
-
- StoredProcedureAttributes attr = creator.createFrom(method("plus1", Integer.class), entityMetadata);
-
- assertThat(attr.getProcedureName()).isEqualTo("User.plus1");
- assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
- assertThat(attr.getOutputParameterNames().get(0)).isEqualTo("res");
- }
-
- @Test // DATAJPA-871
- public void aliasedStoredProcedure() {
-
- StoredProcedureAttributes attr = creator
- .createFrom(method("plus1inoutWithComposedAnnotationOverridingProcedureName", Integer.class), entityMetadata);
-
- assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
- assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
- assertThat(attr.getOutputParameterNames().get(0)).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
- }
-
- @Test // DATAJPA-871
- public void aliasedStoredProcedure2() {
-
- StoredProcedureAttributes attr = creator
- .createFrom(method("plus1inoutWithComposedAnnotationOverridingName", Integer.class), entityMetadata);
-
- assertThat(attr.getProcedureName()).isEqualTo("User.plus1");
- assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class);
- assertThat(attr.getOutputParameterNames().get(0)).isEqualTo("res");
- }
-
- private static Method method(String name, Class>... paramTypes) {
- return ReflectionUtils.findMethod(DummyRepository.class, name, paramTypes);
- }
-
- /**
- * @author Thomas Darimont
- */
- @SuppressWarnings("unused")
- interface DummyRepository {
-
- /**
- * Explicitly mapped to a procedure with name "plus1inout" in database.
- */
- @Procedure("plus1inout")
- // DATAJPA-455
- Integer explicitlyNamedPlus1inout(Integer arg);
-
- /**
- * Explicitly mapped to a procedure with name "plus1inout" in database via alias.
- */
- @Procedure(procedureName = "plus1inout")
- // DATAJPA-455
- Integer explicitPlus1inoutViaProcedureNameAlias(Integer arg);
-
- /**
- * Explicitly mapped to a procedure with name "plus1inout" in database via alias and explicitly named ouput
- * parameter.
- */
- @Procedure(procedureName = "plus1inout", outputParameterName = "res")
- // DATAJPA-1297
- Integer explicitPlus1inoutViaProcedureNameAliasAndOutputParameterName(Integer arg);
-
- /**
- * Implicitly mapped to a procedure with name "plus1inout" in database via alias.
- */
- @Procedure
- // DATAJPA-455
- Integer plus1inout(Integer arg);
-
- /**
- * Explicitly mapped to named stored procedure "User.plus1IO" in {@link EntityManager}.
- */
- @Procedure(name = "User.plus1IO")
- // DATAJPA-455
- Integer entityAnnotatedCustomNamedProcedurePlus1IO(@Param("arg") Integer arg);
-
- /**
- * Explicitly mapped to named stored procedure "User.plus1IO" in {@link EntityManager}.
- * With a outputParameterName
- */
- @Procedure(name = "User.plus1IO", outputParameterName = "override")
- // DATAJPA-707
- Integer entityAnnotatedCustomNamedProcedureOutputParamNamePlus1IO(@Param("arg") Integer arg);
-
- /**
- * Explicitly mapped to named stored procedure "User.plus1IO2" in {@link EntityManager}.
- */
- @Procedure(name = "User.plus1IO2")
- // DATAJPA-707
- Map entityAnnotatedCustomNamedProcedurePlus1IO2(@Param("arg") Integer arg);
-
- /**
- * Implicitly mapped to named stored procedure "User.plus1" in {@link EntityManager}.
- */
- @Procedure
- // DATAJPA-455
- Integer plus1(@Param("arg") Integer arg);
-
- @ComposedProcedureUsingAliasFor(explicitProcedureName = "plus1inout")
- Integer plus1inoutWithComposedAnnotationOverridingProcedureName(Integer arg);
-
- @ComposedProcedureUsingAliasFor(emProcedureName = "User.plus1")
- Integer plus1inoutWithComposedAnnotationOverridingName(Integer arg);
- }
-
- @SuppressWarnings("unused")
- @Procedure
- @Retention(RetentionPolicy.RUNTIME)
- @interface ComposedProcedureUsingAliasFor {
-
- @AliasFor(annotation = Procedure.class, attribute = "value")
- String dbProcedureName() default "";
-
- @AliasFor(annotation = Procedure.class, attribute = "procedureName")
- String explicitProcedureName() default "";
-
- @AliasFor(annotation = Procedure.class, attribute = "name")
- String emProcedureName() default "";
-
- @AliasFor(annotation = Procedure.class, attribute = "outputParameterName")
- String outParamName() default "";
- }
+ ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
+ assertThat(attr.getProcedureName()).isEqualTo("User.plus1IO");
+ assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(outputParameter.getType()).isEqualTo(Integer.class);
+ assertThat(outputParameter.getName()).isEqualTo("override");
+ }
+
+ @Test // DATAJPA-707
+ public void shouldCreateStoredProcedureAttributesFromProcedureMethodBackedWithExplicitlyNamedProcedureAnd2OutParams() {
+
+ StoredProcedureAttributes attr = creator
+ .createFrom(method("entityAnnotatedCustomNamedProcedurePlus1IO2", Integer.class), entityMetadata);
+
+ ProcedureParameter firstOutputParameter = attr.getOutputProcedureParameters().get(0);
+ ProcedureParameter secondOutputParameter = attr.getOutputProcedureParameters().get(1);
+
+ assertThat(attr.getProcedureName()).isEqualTo("User.plus1IO2");
+
+ assertThat(firstOutputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(firstOutputParameter.getType()).isEqualTo(Integer.class);
+ assertThat(firstOutputParameter.getName()).isEqualTo("res");
+
+ assertThat(secondOutputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(secondOutputParameter.getType()).isEqualTo(Integer.class);
+ assertThat(secondOutputParameter.getName()).isEqualTo("res2");
+ }
+
+ @Test // DATAJPA-455
+ public void shouldCreateStoredProcedureAttributesFromProcedureMethodBackedWithImplicitlyNamedProcedure() {
+
+ StoredProcedureAttributes attr = creator.createFrom(method("plus1", Integer.class), entityMetadata);
+
+ ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
+ assertThat(attr.getProcedureName()).isEqualTo("User.plus1");
+ assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(outputParameter.getType()).isEqualTo(Integer.class);
+ assertThat(outputParameter.getName()).isEqualTo("res");
+ }
+
+ @Test // DATAJPA-871
+ public void aliasedStoredProcedure() {
+
+ StoredProcedureAttributes attr = creator
+ .createFrom(method("plus1inoutWithComposedAnnotationOverridingProcedureName", Integer.class), entityMetadata);
+
+ ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
+ assertThat(attr.getProcedureName()).isEqualTo("plus1inout");
+ assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(outputParameter.getType()).isEqualTo(Integer.class);
+ assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
+ }
+
+ @Test // DATAJPA-871
+ public void aliasedStoredProcedure2() {
+
+ StoredProcedureAttributes attr = creator
+ .createFrom(method("plus1inoutWithComposedAnnotationOverridingName", Integer.class), entityMetadata);
+
+ ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
+ assertThat(attr.getProcedureName()).isEqualTo("User.plus1");
+ assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(outputParameter.getType()).isEqualTo(Integer.class);
+ assertThat(outputParameter.getName()).isEqualTo("res");
+ }
+
+ @Test // DATAJPA-652
+ public void testSingleEntityFromResultSetAndNoInput() {
+
+ StoredProcedureAttributes attr = creator
+ .createFrom(method("singleEntityFromResultSetAndNoInput"), entityMetadata);
+
+ ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
+ assertThat(attr.getProcedureName()).isEqualTo("0_input_1_row_resultset");
+ assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(outputParameter.getType()).isEqualTo(Dummy.class);
+ assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
+ }
+
+ @Test // DATAJPA-652
+ public void testSingleEntityFrom1RowResultSetWithInput() {
+
+ StoredProcedureAttributes attr = creator
+ .createFrom(method("singleEntityFrom1RowResultSetWithInput", Integer.class), entityMetadata);
+
+ ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
+ assertThat(attr.getProcedureName()).isEqualTo("1_input_1_row_resultset");
+ assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(outputParameter.getType()).isEqualTo(Dummy.class);
+ assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
+ }
+
+
+ @Test // DATAJPA-652
+ public void testEntityListFrom1RowResultSetWithNoInput() {
+
+ StoredProcedureAttributes attr = creator
+ .createFrom(method("entityListFrom1RowResultSetWithNoInput"), entityMetadata);
+
+ ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
+ assertThat(attr.getProcedureName()).isEqualTo("0_input_1_resultset");
+ assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(outputParameter.getType()).isEqualTo(List.class);
+ assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
+ }
+
+ //
+ @Test // DATAJPA-652
+ public void testEntityListFrom1RowResultSetWithInput() {
+
+ StoredProcedureAttributes attr = creator
+ .createFrom(method("entityListFrom1RowResultSetWithInput", Integer.class), entityMetadata);
+
+ ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
+ assertThat(attr.getProcedureName()).isEqualTo("1_input_1_resultset");
+ assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(outputParameter.getType()).isEqualTo(List.class);
+ assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
+ }
+
+ @Test // DATAJPA-652
+ public void testGenericObjectListFrom1RowResultSetWithInput() {
+
+ StoredProcedureAttributes attr = creator
+ .createFrom(method("genericObjectListFrom1RowResultSetWithInput", Integer.class), entityMetadata);
+
+ ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
+ assertThat(attr.getProcedureName()).isEqualTo("1_input_1_resultset");
+ assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(outputParameter.getType()).isEqualTo(List.class);
+ assertThat(outputParameter.getName()).isEqualTo(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME);
+ }
+
+ @Test // DATAJPA-652
+ public void testEntityListFrom1RowResultSetWithInputAndNamedOutput() {
+
+ StoredProcedureAttributes attr = creator
+ .createFrom(method("entityListFrom1RowResultSetWithInputAndNamedOutput", Integer.class), entityMetadata);
+
+ ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
+ assertThat(attr.getProcedureName()).isEqualTo("1_input_1_resultset");
+ assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.OUT);
+ assertThat(outputParameter.getType()).isEqualTo(List.class);
+ assertThat(outputParameter.getName()).isEqualTo("dummies");
+ }
+
+ @Test // DATAJPA-652
+ public void testEntityListFrom1RowResultSetWithInputAndNamedOutputAndCursor() {
+
+ StoredProcedureAttributes attr = creator
+ .createFrom(method("entityListFrom1RowResultSetWithInputAndNamedOutputAndCursor", Integer.class), entityMetadata);
+
+ ProcedureParameter outputParameter = attr.getOutputProcedureParameters().get(0);
+ assertThat(attr.getProcedureName()).isEqualTo("1_input_1_resultset");
+ assertThat(outputParameter.getMode()).isEqualTo(ParameterMode.REF_CURSOR);
+ assertThat(outputParameter.getType()).isEqualTo(List.class);
+ assertThat(outputParameter.getName()).isEqualTo("dummies");
+ }
+
+ private static Method method(String name, Class>... paramTypes) {
+ return ReflectionUtils.findMethod(DummyRepository.class, name, paramTypes);
+ }
+
+ /**
+ * @author Thomas Darimont
+ */
+ @SuppressWarnings("unused")
+ interface DummyRepository {
+
+ /**
+ * Explicitly mapped to a procedure with name "plus1inout" in database.
+ */
+ @Procedure("plus1inout")
+ // DATAJPA-455
+ Integer explicitlyNamedPlus1inout(Integer arg);
+
+ /**
+ * Explicitly mapped to a procedure with name "plus1inout" in database via alias.
+ */
+ @Procedure(procedureName = "plus1inout")
+ // DATAJPA-455
+ Integer explicitPlus1inoutViaProcedureNameAlias(Integer arg);
+
+ /**
+ * Explicitly mapped to a procedure with name "plus1inout" in database via alias and explicitly named ouput
+ * parameter.
+ */
+ @Procedure(procedureName = "plus1inout", outputParameterName = "res")
+ // DATAJPA-1297
+ Integer explicitPlus1inoutViaProcedureNameAliasAndOutputParameterName(Integer arg);
+
+ /**
+ * Implicitly mapped to a procedure with name "plus1inout" in database via alias.
+ */
+ @Procedure
+ // DATAJPA-455
+ Integer plus1inout(Integer arg);
+
+ /**
+ * Explicitly mapped to named stored procedure "User.plus1IO" in {@link EntityManager}.
+ */
+ @Procedure(name = "User.plus1IO")
+ // DATAJPA-455
+ Integer entityAnnotatedCustomNamedProcedurePlus1IO(@Param("arg") Integer arg);
+
+ /**
+ * Explicitly mapped to named stored procedure "User.plus1IO" in {@link EntityManager}.
+ * With a outputParameterName
+ */
+ @Procedure(name = "User.plus1IO", outputParameterName = "override")
+ // DATAJPA-707
+ Integer entityAnnotatedCustomNamedProcedureOutputParamNamePlus1IO(@Param("arg") Integer arg);
+
+ /**
+ * Explicitly mapped to named stored procedure "User.plus1IO2" in {@link EntityManager}.
+ */
+ @Procedure(name = "User.plus1IO2")
+ // DATAJPA-707
+ Map entityAnnotatedCustomNamedProcedurePlus1IO2(@Param("arg") Integer arg);
+
+ /**
+ * Implicitly mapped to named stored procedure "User.plus1" in {@link EntityManager}.
+ */
+ @Procedure
+ // DATAJPA-455
+ Integer plus1(@Param("arg") Integer arg);
+
+ @ComposedProcedureUsingAliasFor(explicitProcedureName = "plus1inout")
+ Integer plus1inoutWithComposedAnnotationOverridingProcedureName(Integer arg);
+
+ @ComposedProcedureUsingAliasFor(emProcedureName = "User.plus1")
+ Integer plus1inoutWithComposedAnnotationOverridingName(Integer arg);
+
+ @Procedure("0_input_1_row_resultset")
+ // DATAJPA-652
+ Dummy singleEntityFromResultSetAndNoInput();
+
+ @Procedure("1_input_1_row_resultset")
+ // DATAJPA-652
+ Dummy singleEntityFrom1RowResultSetWithInput(Integer arg);
+
+ @Procedure("0_input_1_resultset")
+ // DATAJPA-652
+ List entityListFrom1RowResultSetWithNoInput();
+
+ @Procedure("1_input_1_resultset")
+ // DATAJPA-652
+ List entityListFrom1RowResultSetWithInput(Integer arg);
+
+ @Procedure(value = "1_input_1_resultset", outputParameterName = "dummies")
+ // DATAJPA-652
+ List entityListFrom1RowResultSetWithInputAndNamedOutput(Integer arg);
+
+ @Procedure(value = "1_input_1_resultset", outputParameterName = "dummies", refCursor = true)
+ // DATAJPA-652
+ List entityListFrom1RowResultSetWithInputAndNamedOutputAndCursor(Integer arg);
+ }
+
+ @SuppressWarnings("unused")
+ @Procedure
+ @Retention(RetentionPolicy.RUNTIME)
+ @interface ComposedProcedureUsingAliasFor {
+
+ @AliasFor(annotation = Procedure.class, attribute = "value")
+ String dbProcedureName() default "";
+
+ @AliasFor(annotation = Procedure.class, attribute = "procedureName")
+ String explicitProcedureName() default "";
+
+ @AliasFor(annotation = Procedure.class, attribute = "name")
+ String emProcedureName() default "";
+
+ @AliasFor(annotation = Procedure.class, attribute = "outputParameterName")
+ String outParamName() default "";
+
+ @AliasFor(annotation = Procedure.class, attribute = "refCursor")
+ boolean refCursor() default false;
+ }
}
diff --git a/src/test/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributesUnitTests.java b/src/test/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributesUnitTests.java
index f3c0eada8a..36ae3b3124 100644
--- a/src/test/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributesUnitTests.java
+++ b/src/test/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributesUnitTests.java
@@ -20,6 +20,8 @@
import org.junit.Test;
+import javax.persistence.ParameterMode;
+
/**
* Unit tests for {@link StoredProcedureAttributes}.
*
@@ -31,7 +33,8 @@ public class StoredProcedureAttributesUnitTests {
@Test // DATAJPA-681
public void usesSyntheticOutputParameterNameForAdhocProcedureWithoutOutputName() {
- StoredProcedureAttributes attributes = new StoredProcedureAttributes("procedure", null, Long.class);
- assertThat(attributes.getOutputParameterNames().get(0)).isEqualTo(SYNTHETIC_OUTPUT_PARAMETER_NAME);
+ ProcedureParameter outputParameter = new ProcedureParameter(null, ParameterMode.OUT, Long.class);
+ StoredProcedureAttributes attributes = new StoredProcedureAttributes("procedure", outputParameter);
+ assertThat(attributes.getOutputProcedureParameters().get(0).getName()).isEqualTo(SYNTHETIC_OUTPUT_PARAMETER_NAME);
}
}
diff --git a/src/test/java/org/springframework/data/jpa/repository/sample/DummyRepository.java b/src/test/java/org/springframework/data/jpa/repository/sample/DummyRepository.java
index 47bb91c71c..104308b8c5 100644
--- a/src/test/java/org/springframework/data/jpa/repository/sample/DummyRepository.java
+++ b/src/test/java/org/springframework/data/jpa/repository/sample/DummyRepository.java
@@ -34,11 +34,11 @@ public interface DummyRepository extends CrudRepository {
@Procedure("procedure_in0_out1")
Integer adHocProcedureWithNoInputAnd1OutputParameter();
- @Procedure("procedure_in1_out0_return_rs_no_update")
- List adHocProcedureWith1InputAnd1OutputParameterWithResultSet(String in);
+ @Procedure("procedure_in1_out0_return_ref_cursor_no_update")
+ List adHocProcedureWith1InputAnd1OutputParameterWithRefCursor(String in);
- @Procedure("procedure_in1_out0_return_rs_with_update")
- List adHocProcedureWith1InputAnd1OutputParameterWithResultSetWithUpdate(String in);
+ @Procedure("procedure_in1_out0_return_ref_cursor_with_update")
+ List adHocProcedureWith1InputAnd1OutputParameterWithRefCursorWithUpdate(String in);
@Procedure("procedure_in1_out0_no_return_with_update")
void adHocProcedureWith1InputAndNoOutputParameterWithUpdate(String in);
diff --git a/src/test/resources/scripts/schema-stored-procedures.sql b/src/test/resources/scripts/schema-stored-procedures.sql
index 859133de01..fa0cc2a803 100644
--- a/src/test/resources/scripts/schema-stored-procedures.sql
+++ b/src/test/resources/scripts/schema-stored-procedures.sql
@@ -27,9 +27,9 @@ DROP procedure IF EXISTS procedure_in1_out0
/;
DROP procedure IF EXISTS procedure_in0_out1
/;
-DROP procedure IF EXISTS procedure_in1_out0_return_rs_no_update
+DROP procedure IF EXISTS procedure_in1_out0_return_ref_cursor_no_update
/;
-DROP procedure IF EXISTS procedure_in1_out0_return_rs_with_update
+DROP procedure IF EXISTS procedure_in1_out0_return_ref_cursor_with_update
/;
DROP procedure IF EXISTS procedure_in1_out0_no_return_with_update
/;
@@ -65,7 +65,7 @@ set res = 42;
END
/;
-CREATE procedure procedure_in1_out0_return_rs_no_update (IN arg varchar(32))
+CREATE procedure procedure_in1_out0_return_ref_cursor_no_update (IN arg varchar(32))
READS SQL DATA DYNAMIC RESULT SETS 1
BEGIN ATOMIC
DECLARE result CURSOR WITH RETURN FOR SELECT * FROM public.dummy FOR READ ONLY;
@@ -73,7 +73,7 @@ open result;
END
/;
-CREATE procedure procedure_in1_out0_return_rs_with_update (IN arg varchar(32))
+CREATE procedure procedure_in1_out0_return_ref_cursor_with_update (IN arg varchar(32))
MODIFIES SQL DATA DYNAMIC RESULT SETS 1
BEGIN ATOMIC
DECLARE result CURSOR WITH RETURN FOR SELECT * FROM public.dummy FOR READ ONLY;