DATAJPA-707 - Polishing.

Code formatting.
Refactoring to improve readability.

Original pull request: #297.
This commit is contained in:
Jens Schauder
2019-06-06 08:44:55 +02:00
parent e41236f722
commit 2f03fc0067
8 changed files with 171 additions and 160 deletions

View File

@@ -72,7 +72,7 @@ enum StoredProcedureAttributeSource {
+ method);
}
return new StoredProcedureAttributes(procedureName, procedure.outputParameterName(), method.getReturnType(), false);
return new StoredProcedureAttributes(procedureName, procedure.outputParameterName(), method.getReturnType());
}
/**

View File

@@ -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<String> outputParameterNames,
List<Class<?>> outputParameterTypes, boolean namedStoredProcedure) {
StoredProcedureAttributes(String procedureName, List<String> outputParameterNames,
List<Class<?>> 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<String> completeOutputParameterNames(List<String> 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.
*

View File

@@ -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<String, Object> of output parameter names to values
* <p>
* Result is either a single value, or a Map<String, Object> of output parameter names to values
*/
@Nullable
Object extractOutputValue(StoredProcedureQuery storedProcedureQuery) {
@@ -122,23 +121,44 @@ class StoredProcedureJpaQuery extends AbstractJpaQuery {
return null;
}
Map<String, Object> 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<String, Object> 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();
}

View File

@@ -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
*/

View File

@@ -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<String, Integer> 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);
}
}

View File

@@ -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<User> entityMetadata;
@Mock
JpaEntityMetadata<User> 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<String, Integer> 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")

View File

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

View File

@@ -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<String, Integer> entityAnnotatedCustomNamedProcedurePlus1IO2(@Param("arg") Integer arg);