From 2f03fc0067ade395e55986afb37a2e27dc869595 Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Thu, 6 Jun 2019 08:44:55 +0200 Subject: [PATCH] DATAJPA-707 - Polishing. Code formatting. Refactoring to improve readability. Original pull request: #297. --- .../query/StoredProcedureAttributeSource.java | 2 +- .../query/StoredProcedureAttributes.java | 58 +++++---- .../query/StoredProcedureJpaQuery.java | 56 ++++++--- .../data/jpa/domain/sample/Dummy.java | 2 +- ...itoryStoredProcedureIntegrationTests.java} | 90 +++++-------- ...oredProcedureAttributeSourceUnitTests.java | 119 +++++++++--------- .../StoredProcedureAttributesUnitTests.java | 2 +- .../jpa/repository/sample/UserRepository.java | 2 +- 8 files changed, 171 insertions(+), 160 deletions(-) rename src/test/java/org/springframework/data/jpa/repository/{UserRepositoryStoredProcedureTests.java => UserRepositoryStoredProcedureIntegrationTests.java} (60%) diff --git a/src/main/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributeSource.java b/src/main/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributeSource.java index 331f8b78a..38dd10d0b 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributeSource.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributeSource.java @@ -72,7 +72,7 @@ enum StoredProcedureAttributeSource { + method); } - return new StoredProcedureAttributes(procedureName, procedure.outputParameterName(), method.getReturnType(), false); + return new StoredProcedureAttributes(procedureName, procedure.outputParameterName(), method.getReturnType()); } /** diff --git a/src/main/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributes.java b/src/main/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributes.java index 2e90eb638..9d981b26b 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributes.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/StoredProcedureAttributes.java @@ -15,13 +15,12 @@ */ package org.springframework.data.jpa.repository.query; -import javax.persistence.StoredProcedureQuery; - import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; -import java.util.Arrays; +import javax.persistence.StoredProcedureQuery; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -33,11 +32,12 @@ import java.util.stream.IntStream; * @author Oliver Gierke * @author Mark Paluch * @author Jeff Sheets + * @author Jens Schauder * @since 1.6 */ class StoredProcedureAttributes { - // A syntheic output parameter name to be used in case of derived stored procedures and named parameters + // A synthetic output parameter name to be used in case of derived stored procedures and named parameters static final String SYNTHETIC_OUTPUT_PARAMETER_NAME = "out"; private final boolean namedStoredProcedure; @@ -48,26 +48,25 @@ class StoredProcedureAttributes { /** * Creates a new {@link StoredProcedureAttributes}. * - * @param procedureName must not be {@literal null} - * @param outputParameterName may be {@literal null} - * @param outputParameterType must not be {@literal null} - * @param namedStoredProcedure + * @param procedureName must not be {@literal null}. + * @param outputParameterName may be {@literal null}. + * @param outputParameterType must not be {@literal null}. */ - public StoredProcedureAttributes(String procedureName, @Nullable String outputParameterName, - Class outputParameterType, boolean namedStoredProcedure) { - this(procedureName, Arrays.asList(outputParameterName), Arrays.asList(outputParameterType), namedStoredProcedure); + StoredProcedureAttributes(String procedureName, @Nullable String outputParameterName, + Class outputParameterType) { + this(procedureName, Collections.singletonList(outputParameterName), Collections.singletonList(outputParameterType), false); } /** * Creates a new {@link StoredProcedureAttributes}. * - * @param procedureName must not be {@literal null} - * @param outputParameterNames may be empty, but not null - * @param outputParameterTypes must not be empty, and cannot be a single element of null - * @param namedStoredProcedure + * @param procedureName must not be {@literal null}. + * @param outputParameterNames may be empty, but not {@literal null}. + * @param outputParameterTypes must not be empty, and cannot be a single element of {@literal null}. + * @param namedStoredProcedure flag signaling if the stored procedure has a name. */ - public StoredProcedureAttributes(String procedureName, List outputParameterNames, - List> outputParameterTypes, boolean namedStoredProcedure) { + StoredProcedureAttributes(String procedureName, List outputParameterNames, + List> outputParameterTypes, boolean namedStoredProcedure) { Assert.notNull(procedureName, "ProcedureName must not be null!"); Assert.notNull(outputParameterNames, "OutputParameterNames must not be null!"); @@ -75,14 +74,31 @@ class StoredProcedureAttributes { Assert.isTrue(outputParameterTypes.size() != 1 || outputParameterTypes.get(0) != null, "OutputParameterTypes must not have size 1 with a null value"); this.procedureName = procedureName; - this.outputParameterNames = namedStoredProcedure ? outputParameterNames : IntStream.range(0, outputParameterNames.size()).mapToObj(i -> { - String paramName = outputParameterNames.get(i); - return !StringUtils.hasText(paramName) ? SYNTHETIC_OUTPUT_PARAMETER_NAME + (i == 0 ? "" : i) : paramName; - }).collect(Collectors.toList()); + this.outputParameterNames = namedStoredProcedure + ? outputParameterNames + : completeOutputParameterNames(outputParameterNames); this.outputParameterTypes = outputParameterTypes; this.namedStoredProcedure = namedStoredProcedure; } + private List completeOutputParameterNames(List outputParameterNames) { + + return IntStream.range(0, outputParameterNames.size()) // + .mapToObj(i -> completeOutputParameterName(i, outputParameterNames.get(i))) // + .collect(Collectors.toList()); + } + + private String completeOutputParameterName(int i, String paramName) { + + return StringUtils.hasText(paramName) // + ? paramName // + : createSyntheticParameterName(i); + } + + private String createSyntheticParameterName(int i) { + return SYNTHETIC_OUTPUT_PARAMETER_NAME + (i == 0 ? "" : i); + } + /** * Returns the name of the stored procedure. * diff --git a/src/main/java/org/springframework/data/jpa/repository/query/StoredProcedureJpaQuery.java b/src/main/java/org/springframework/data/jpa/repository/query/StoredProcedureJpaQuery.java index ed48ff044..1724bc2a9 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/StoredProcedureJpaQuery.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/StoredProcedureJpaQuery.java @@ -15,12 +15,6 @@ */ package org.springframework.data.jpa.repository.query; -import javax.persistence.EntityManager; -import javax.persistence.NamedStoredProcedureQuery; -import javax.persistence.ParameterMode; -import javax.persistence.StoredProcedureQuery; -import javax.persistence.TypedQuery; - import org.springframework.data.jpa.repository.query.JpaParameters.JpaParameter; import org.springframework.data.repository.query.Parameter; import org.springframework.data.repository.query.QueryMethod; @@ -28,6 +22,11 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import javax.persistence.EntityManager; +import javax.persistence.NamedStoredProcedureQuery; +import javax.persistence.ParameterMode; +import javax.persistence.StoredProcedureQuery; +import javax.persistence.TypedQuery; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -53,7 +52,7 @@ class StoredProcedureJpaQuery extends AbstractJpaQuery { * Creates a new {@link StoredProcedureJpaQuery}. * * @param method must not be {@literal null} - * @param em must not be {@literal null} + * @param em must not be {@literal null} */ StoredProcedureJpaQuery(JpaQueryMethod method, EntityManager em) { @@ -110,8 +109,8 @@ class StoredProcedureJpaQuery extends AbstractJpaQuery { * 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 values + *

+ * Result is either a single value, or a Map of output parameter names to values */ @Nullable Object extractOutputValue(StoredProcedureQuery storedProcedureQuery) { @@ -122,23 +121,44 @@ class StoredProcedureJpaQuery extends AbstractJpaQuery { return null; } - Map outputValues = IntStream.range(0, procedureAttributes.getOutputParameterNames().size()) - .boxed().collect(Collectors.toMap(procedureAttributes.getOutputParameterNames()::get, i -> { - String outputParameterName = procedureAttributes.getOutputParameterNames().get(i); - JpaParameters parameters = getQueryMethod().getParameters(); - - return useNamedParameters && StringUtils.hasText(outputParameterName) ? // - storedProcedureQuery.getOutputParameterValue(outputParameterName) - : storedProcedureQuery.getOutputParameterValue(parameters.getNumberOfParameters() + i + 1); - })); + Map outputValues = IntStream.range(0, procedureAttributes.getOutputParameterNames().size()) // + .boxed() // + .collect(Collectors.toMap( // + procedureAttributes.getOutputParameterNames()::get, // + i -> 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(); } 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 51a59bbe2..5b82c1553 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 @@ -26,7 +26,7 @@ import javax.persistence.StoredProcedureParameter; import org.springframework.util.ObjectUtils; /** - * Sample domain class representing used for Stored Procedure tests. + * Sample domain class used for Stored Procedure tests. * * @author Thomas Darimont */ diff --git a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryStoredProcedureTests.java b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryStoredProcedureIntegrationTests.java similarity index 60% rename from src/test/java/org/springframework/data/jpa/repository/UserRepositoryStoredProcedureTests.java rename to src/test/java/org/springframework/data/jpa/repository/UserRepositoryStoredProcedureIntegrationTests.java index cb5fcbd3b..91da70a42 100644 --- a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryStoredProcedureTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryStoredProcedureIntegrationTests.java @@ -15,19 +15,7 @@ */ package org.springframework.data.jpa.repository; -import static org.hamcrest.CoreMatchers.*; -import static org.hamcrest.Matchers.hasEntry; -import static org.junit.Assert.*; -import static org.junit.Assume.*; -import static org.springframework.data.jpa.support.EntityManagerTestUtils.*; - -import javax.persistence.*; - -import org.junit.Assume; -import org.junit.Ignore; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.InvalidDataAccessApiUsageException; @@ -36,94 +24,83 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; +import javax.persistence.EntityManager; +import javax.persistence.ParameterMode; +import javax.persistence.PersistenceContext; +import javax.persistence.StoredProcedureQuery; import java.util.Map; +import static org.assertj.core.api.Assertions.*; + /** * Integration tests for JPA 2.1 stored procedure support. * * @author Thomas Darimont * @author Oliver Gierke * @author Jeff Sheets + * @author Jens Schauder * @since 1.6 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:application-context.xml") @Transactional -public class UserRepositoryStoredProcedureTests { +public class UserRepositoryStoredProcedureIntegrationTests { - @Autowired UserRepository repository; - @PersistenceContext EntityManager em; - - @Rule public ExpectedException exception = ExpectedException.none(); + @Autowired + UserRepository repository; + @PersistenceContext + EntityManager em; @Test // DATAJPA-455 public void callProcedureWithInAndOutParameters() { - assumeTrue(currentEntityManagerIsAJpa21EntityManager(em)); - - assertThat(repository.plus1inout(1), is(2)); + assertThat(repository.plus1inout(1)).isEqualTo(2); } @Test // DATAJPA-707 public void callProcedureWithInAndOutParametersInvalidOutParamName() { - assumeTrue(currentEntityManagerIsAJpa21EntityManager(em)); - - assertThat(repository.plus1inoutInvalidOutParamName(1), is(2)); + assertThat(repository.plus1inoutInvalidOutParamName(1)).isEqualTo(2); } @Test // DATAJPA-455 public void callProcedureExplicitNameWithInAndOutParameters() { - assumeTrue(currentEntityManagerIsAJpa21EntityManager(em)); - - assertThat(repository.explicitlyNamedPlus1inout(1), is(2)); + assertThat(repository.explicitlyNamedPlus1inout(1)).isEqualTo(2); } @Test // DATAJPA-455 public void entityAnnotatedCustomNamedProcedurePlus1IO() { - assumeTrue(currentEntityManagerIsAJpa21EntityManager(em)); - - assertThat(repository.entityAnnotatedCustomNamedProcedurePlus1IO(1), is(2)); + assertThat(repository.entityAnnotatedCustomNamedProcedurePlus1IO(1)).isEqualTo(2); } @Test // DATAJPA-707 public void entityAnnotatedCustomNamedProcedurePlus1IOInvalidOutParamName() { - assumeTrue(currentEntityManagerIsAJpa21EntityManager(em)); - - exception.expect(InvalidDataAccessApiUsageException.class); - exception.expectMessage(containsString("Could not locate parameter registered under that name")); - - repository.entityAnnotatedCustomNamedProcedurePlus1IOInvalidOutParamName(1); + assertThatThrownBy( // + () -> repository.entityAnnotatedCustomNamedProcedurePlus1IOInvalidOutParamName(1)) // + .isInstanceOf(InvalidDataAccessApiUsageException.class) // + .hasMessageContaining("Could not locate parameter registered under that name"); } @Test // DATAJPA-707 public void entityAnnotatedCustomNamedProcedurePlus1IO2TwoOutParamsButNamingOne() { - assumeTrue(currentEntityManagerIsAJpa21EntityManager(em)); - - assertThat(repository.entityAnnotatedCustomNamedProcedurePlus1IO2TwoOutParamsButNamingOne(1), is(3)); + assertThat(repository.entityAnnotatedCustomNamedProcedurePlus1IO2TwoOutParamsButNamingOne(1)).isEqualTo(3); } @Test // DATAJPA-707 public void entityAnnotatedCustomNamedProcedurePlus1IO2() { - assumeTrue(currentEntityManagerIsAJpa21EntityManager(em)); - Map result = repository.entityAnnotatedCustomNamedProcedurePlus1IO2(1); - assertThat(result, hasEntry("res", 2)); - assertThat(result, hasEntry("res2", 3)); - assertThat(result.size(), is(2)); + + assertThat(result).containsExactly(entry("res", 2), entry("res2", 3)); } @Test // DATAJPA-455 - @Ignore public void plainJpa21() { - assumeTrue(currentEntityManagerIsAJpa21EntityManager(em)); - StoredProcedureQuery proc = em.createStoredProcedureQuery("plus1inout"); proc.registerStoredProcedureParameter(1, Integer.class, ParameterMode.IN); proc.registerStoredProcedureParameter(2, Integer.class, ParameterMode.OUT); @@ -131,29 +108,23 @@ public class UserRepositoryStoredProcedureTests { proc.setParameter(1, 1); proc.execute(); - assertThat(proc.getOutputParameterValue(2), is((Object) 2)); + assertThat(proc.getOutputParameterValue(2)).isEqualTo(2); } @Test // DATAJPA-455 - @Ignore public void plainJpa21_entityAnnotatedCustomNamedProcedurePlus1IO() { - Assume.assumeTrue(currentEntityManagerIsAJpa21EntityManager(em)); - StoredProcedureQuery proc = em.createNamedStoredProcedureQuery("User.plus1IO"); proc.setParameter("arg", 1); proc.execute(); - assertThat(proc.getOutputParameterValue("res"), is((Object) 2)); + assertThat(proc.getOutputParameterValue("res")).isEqualTo(2); } @Test // DATAJPA-707 - @Ignore public void plainJpa21_twoOutParams() { - assumeTrue(currentEntityManagerIsAJpa21EntityManager(em)); - StoredProcedureQuery proc = em.createStoredProcedureQuery("plus1inout2"); proc.registerStoredProcedureParameter(1, Integer.class, ParameterMode.IN); proc.registerStoredProcedureParameter(2, Integer.class, ParameterMode.OUT); @@ -162,22 +133,19 @@ public class UserRepositoryStoredProcedureTests { proc.setParameter(1, 1); proc.execute(); - assertThat(proc.getOutputParameterValue(2), is((Object) 2)); - assertThat(proc.getOutputParameterValue(3), is((Object) 3)); + assertThat(proc.getOutputParameterValue(2)).isEqualTo(2); + assertThat(proc.getOutputParameterValue(3)).isEqualTo(3); } @Test // DATAJPA-707 - @Ignore public void plainJpa21_entityAnnotatedCustomNamedProcedurePlus1IO2() { - Assume.assumeTrue(currentEntityManagerIsAJpa21EntityManager(em)); - StoredProcedureQuery proc = em.createNamedStoredProcedureQuery("User.plus1IO2"); proc.setParameter("arg", 1); proc.execute(); - assertThat(proc.getOutputParameterValue("res"), is((Object) 2)); - assertThat(proc.getOutputParameterValue("res2"), is((Object) 3)); + assertThat(proc.getOutputParameterValue("res")).isEqualTo(2); + assertThat(proc.getOutputParameterValue("res2")).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 6ebd0cb98..ad6ddd72e 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 @@ -15,18 +15,6 @@ */ package org.springframework.data.jpa.repository.query; -import static org.hamcrest.CoreMatchers.*; -import static org.hamcrest.object.IsCompatibleType.*; -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.Method; -import java.util.Map; - -import javax.persistence.EntityManager; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -37,6 +25,15 @@ 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 java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.Method; +import java.util.Map; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + /** * Unit tests for {@link StoredProcedureAttributeSource}. * @@ -45,13 +42,15 @@ import org.springframework.util.ReflectionUtils; * @author Christoph Strobl * @author Diego Diez * @author Jeff Sheets + * @author Jens Schauder * @since 1.6 */ @RunWith(MockitoJUnitRunner.class) public class StoredProcedureAttributeSourceUnitTests { StoredProcedureAttributeSource creator; - @Mock JpaEntityMetadata entityMetadata; + @Mock + JpaEntityMetadata entityMetadata; @Before public void setup() { @@ -67,9 +66,9 @@ public class StoredProcedureAttributeSourceUnitTests { StoredProcedureAttributes attr = creator.createFrom(method("plus1inout", Integer.class), entityMetadata); - assertThat(attr.getProcedureName(), is("plus1inout")); - assertThat(attr.getOutputParameterTypes().get(0), is(typeCompatibleWith(Integer.class))); - assertThat(attr.getOutputParameterNames().get(0), is(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME)); + 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-455 @@ -78,9 +77,9 @@ public class StoredProcedureAttributeSourceUnitTests { StoredProcedureAttributes attr = creator.createFrom(method("explicitlyNamedPlus1inout", Integer.class), entityMetadata); - assertThat(attr.getProcedureName(), is("plus1inout")); - assertThat(attr.getOutputParameterTypes().get(0), is(typeCompatibleWith(Integer.class))); - assertThat(attr.getOutputParameterNames().get(0), is(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME)); + 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-455 @@ -89,9 +88,9 @@ public class StoredProcedureAttributeSourceUnitTests { StoredProcedureAttributes attr = creator.createFrom(method("explicitlyNamedPlus1inout", Integer.class), entityMetadata); - assertThat(attr.getProcedureName(), is("plus1inout")); - assertThat(attr.getOutputParameterTypes().get(0), is(typeCompatibleWith(Integer.class))); - assertThat(attr.getOutputParameterNames().get(0), is(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME)); + 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-455 @@ -100,9 +99,9 @@ public class StoredProcedureAttributeSourceUnitTests { StoredProcedureAttributes attr = creator .createFrom(method("explicitPlus1inoutViaProcedureNameAlias", Integer.class), entityMetadata); - assertThat(attr.getProcedureName(), is("plus1inout")); - assertThat(attr.getOutputParameterTypes().get(0), is(typeCompatibleWith(Integer.class))); - assertThat(attr.getOutputParameterNames().get(0), is(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME)); + 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-1297 @@ -111,9 +110,9 @@ public class StoredProcedureAttributeSourceUnitTests { StoredProcedureAttributes attr = creator.createFrom( method("explicitPlus1inoutViaProcedureNameAliasAndOutputParameterName", Integer.class), entityMetadata); - assertThat(attr.getProcedureName(), is("plus1inout")); - assertThat(attr.getOutputParameterTypes().get(0), is(typeCompatibleWith(Integer.class))); - assertThat(attr.getOutputParameterNames().get(0), is("res")); + assertThat(attr.getProcedureName()).isEqualTo("plus1inout"); + assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class); + assertThat(attr.getOutputParameterNames().get(0)).isEqualTo("res"); } @Test // DATAJPA-455 @@ -122,9 +121,9 @@ public class StoredProcedureAttributeSourceUnitTests { StoredProcedureAttributes attr = creator .createFrom(method("entityAnnotatedCustomNamedProcedurePlus1IO", Integer.class), entityMetadata); - assertThat(attr.getProcedureName(), is("User.plus1IO")); - assertThat(attr.getOutputParameterTypes().get(0), is(typeCompatibleWith(Integer.class))); - assertThat(attr.getOutputParameterNames().get(0), is("res")); + assertThat(attr.getProcedureName()).isEqualTo("User.plus1IO"); + assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class); + assertThat(attr.getOutputParameterNames().get(0)).isEqualTo("res"); } @Test // DATAJPA-707 @@ -133,9 +132,9 @@ public class StoredProcedureAttributeSourceUnitTests { StoredProcedureAttributes attr = creator .createFrom(method("entityAnnotatedCustomNamedProcedureOutputParamNamePlus1IO", Integer.class), entityMetadata); - assertThat(attr.getProcedureName(), is("User.plus1IO")); - assertThat(attr.getOutputParameterTypes().get(0), is(typeCompatibleWith(Integer.class))); - assertThat(attr.getOutputParameterNames().get(0), is("override")); + assertThat(attr.getProcedureName()).isEqualTo("User.plus1IO"); + assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class); + assertThat(attr.getOutputParameterNames().get(0)).isEqualTo("override"); } @Test // DATAJPA-707 @@ -144,11 +143,11 @@ public class StoredProcedureAttributeSourceUnitTests { StoredProcedureAttributes attr = creator .createFrom(method("entityAnnotatedCustomNamedProcedurePlus1IO2", Integer.class), entityMetadata); - assertThat(attr.getProcedureName(), is("User.plus1IO2")); - assertThat(attr.getOutputParameterTypes().get(0), is(typeCompatibleWith(Integer.class))); - assertThat(attr.getOutputParameterNames().get(0), is("res")); - assertThat(attr.getOutputParameterTypes().get(1), is(typeCompatibleWith(Integer.class))); - assertThat(attr.getOutputParameterNames().get(1), is("res2")); + 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 @@ -156,9 +155,9 @@ public class StoredProcedureAttributeSourceUnitTests { StoredProcedureAttributes attr = creator.createFrom(method("plus1", Integer.class), entityMetadata); - assertThat(attr.getProcedureName(), is("User.plus1")); - assertThat(attr.getOutputParameterTypes().get(0), is(typeCompatibleWith(Integer.class))); - assertThat(attr.getOutputParameterNames().get(0), is("res")); + assertThat(attr.getProcedureName()).isEqualTo("User.plus1"); + assertThat(attr.getOutputParameterTypes().get(0)).isEqualTo(Integer.class); + assertThat(attr.getOutputParameterNames().get(0)).isEqualTo("res"); } @Test // DATAJPA-871 @@ -167,9 +166,9 @@ public class StoredProcedureAttributeSourceUnitTests { StoredProcedureAttributes attr = creator .createFrom(method("plus1inoutWithComposedAnnotationOverridingProcedureName", Integer.class), entityMetadata); - assertThat(attr.getProcedureName(), is(equalTo("plus1inout"))); - assertThat(attr.getOutputParameterTypes().get(0), is(typeCompatibleWith(Integer.class))); - assertThat(attr.getOutputParameterNames().get(0), is(StoredProcedureAttributes.SYNTHETIC_OUTPUT_PARAMETER_NAME)); + 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 @@ -178,9 +177,9 @@ public class StoredProcedureAttributeSourceUnitTests { StoredProcedureAttributes attr = creator .createFrom(method("plus1inoutWithComposedAnnotationOverridingName", Integer.class), entityMetadata); - assertThat(attr.getProcedureName(), is(equalTo("User.plus1"))); - assertThat(attr.getOutputParameterTypes().get(0), is(typeCompatibleWith(Integer.class))); - assertThat(attr.getOutputParameterNames().get(0), is(equalTo("res"))); + 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) { @@ -196,51 +195,59 @@ public class StoredProcedureAttributeSourceUnitTests { /** * Explicitly mapped to a procedure with name "plus1inout" in database. */ - @Procedure("plus1inout") // DATAJPA-455 + @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 + @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 + @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 + @Procedure + // DATAJPA-455 Integer plus1inout(Integer arg); /** * Explicitly mapped to named stored procedure "User.plus1IO" in {@link EntityManager}. */ - @Procedure(name = "User.plus1IO") // DATAJPA-455 + @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 + @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 + @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 + @Procedure + // DATAJPA-455 Integer plus1(@Param("arg") Integer arg); @ComposedProcedureUsingAliasFor(explicitProcedureName = "plus1inout") 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 d6ada7498..ecd49270b 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 @@ -31,7 +31,7 @@ public class StoredProcedureAttributesUnitTests { @Test // DATAJPA-681 public void usesSyntheticOutputParameterNameForAdhocProcedureWithoutOutputName() { - StoredProcedureAttributes attributes = new StoredProcedureAttributes("procedure", null, Long.class, false); + StoredProcedureAttributes attributes = new StoredProcedureAttributes("procedure", null, Long.class); assertThat(attributes.getOutputParameterNames().get(0), is(SYNTHETIC_OUTPUT_PARAMETER_NAME)); } } diff --git a/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java b/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java index 2c7c2c43a..c61dd06c1 100644 --- a/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java +++ b/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java @@ -348,7 +348,7 @@ public interface UserRepository /** * Explicitly mapped to named stored procedure "User.plus1IO2" in {@link EntityManager}. - * Returns 2 out params as a List + * Returns 2 out params as a Map. */ @Procedure(name = "User.plus1IO2") // DATAJPA-707 Map entityAnnotatedCustomNamedProcedurePlus1IO2(@Param("arg") Integer arg);