diff --git a/pom.xml b/pom.xml index bd4b95e11a..d503670b70 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-jpa - 1.8.0.BUILD-SNAPSHOT + 1.8.0.DATAJPA-652-SNAPSHOT Spring Data JPA Spring Data module for JPA repositories. 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 98035fd033..47fef757c4 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 @@ -1,5 +1,5 @@ /* - * Copyright 2014 the original author or authors. + * Copyright 2014-2015 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. @@ -57,7 +57,7 @@ public StoredProcedureAttributes createFrom(Method method, JpaEntityMetadata procedure); if (namedStoredProc != null) { - return newProcedureAttributesFrom(method, namedStoredProc); + return newProcedureAttributesFrom(method, namedStoredProc, procedure); } String procedureName = deriveProcedureNameFrom(method, procedure); @@ -90,31 +90,55 @@ private String deriveProcedureNameFrom(Method method, Procedure procedure) { /** * @param method * @param namedStoredProc + * @param procedure * @return */ - private StoredProcedureAttributes newProcedureAttributesFrom(Method method, NamedStoredProcedureQuery namedStoredProc) { + private StoredProcedureAttributes newProcedureAttributesFrom(Method method, + NamedStoredProcedureQuery namedStoredProc, Procedure procedure) { String outputParameterName = null; Class outputParameterType = null; - int outputParameterCount = 0; + if (!procedure.outputParameterName().isEmpty()) { + + // we give the output parameter definition from the @Procedure annotation precedence + outputParameterName = procedure.outputParameterName(); + } else { + + // try to discover the output parameter + List outputParameters = extractOutputParametersFrom(namedStoredProc); + + if (outputParameters.size() != 1 && !void.class.equals(method.getReturnType())) { + throw new IllegalStateException(String.format( + "Could not create ProcedureAttributes from %s. We currently support exactly one output parameter!", method)); + } + + if (!outputParameters.isEmpty()) { + StoredProcedureParameter outputParameter = outputParameters.get(0); + outputParameterName = outputParameter.name(); + outputParameterType = outputParameter.type(); + } + } + + if (outputParameterType == null || Object.class.equals(outputParameterType) + || void.class.equals(outputParameterType)) { + outputParameterType = method.getReturnType(); + } + + return new StoredProcedureAttributes(namedStoredProc.name(), outputParameterName, outputParameterType, true); + } + + private List extractOutputParametersFrom(NamedStoredProcedureQuery namedStoredProc) { + + List outputParameters = new ArrayList(); for (StoredProcedureParameter param : namedStoredProc.parameters()) { + switch (param.mode()) { case OUT: case INOUT: - - if (outputParameterCount > 0) { - throw new IllegalStateException( - String.format( - "Could not create ProcedureAttributes from %s. We currently support only one output parameter!", - method)); - } - - outputParameterName = param.name(); - outputParameterType = param.type(); - - outputParameterCount++; + case REF_CURSOR: + outputParameters.add(param); break; case IN: default: @@ -122,11 +146,7 @@ private StoredProcedureAttributes newProcedureAttributesFrom(Method method, Name } } - if (outputParameterType == null) { - outputParameterType = method.getReturnType(); - } - - return new StoredProcedureAttributes(namedStoredProc.name(), outputParameterName, outputParameterType, true); + return outputParameters; } /** 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 new file mode 100644 index 0000000000..ead55531d2 --- /dev/null +++ b/src/test/java/org/springframework/data/jpa/domain/sample/Dummy.java @@ -0,0 +1,116 @@ +/* + * Copyright 2015 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.jpa.domain.sample; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.NamedStoredProcedureQueries; +import javax.persistence.NamedStoredProcedureQuery; +import javax.persistence.ParameterMode; +import javax.persistence.StoredProcedureParameter; + +import org.springframework.util.ObjectUtils; + +/** + * Sample domain class representing used for Stored Procedure tests. + * + * @author Thomas Darimont + */ +@Entity +@NamedStoredProcedureQueries({ // + @NamedStoredProcedureQuery(name = "Dummy.procedureWith1InputAnd1OutputParameter", + procedureName = "procedure_in1_out1", parameters = { + @StoredProcedureParameter(mode = ParameterMode.IN, type = Integer.class), + @StoredProcedureParameter(mode = ParameterMode.OUT, type = Integer.class) }) // + , + @NamedStoredProcedureQuery(name = "Dummy.procedureWith1InputAndNoOutputParameter", + procedureName = "procedure_in1_out0", parameters = { @StoredProcedureParameter(mode = ParameterMode.IN, + type = Integer.class) }) // + , + @NamedStoredProcedureQuery(name = "Dummy.procedureWithNoInputAnd1OutputParameter", + procedureName = "procedure_in0_out1", parameters = { @StoredProcedureParameter(mode = ParameterMode.OUT, + type = Integer.class) }) // + , + @NamedStoredProcedureQuery(name = "Dummy.procedureWith1InputAnd1OutputParameterWithResultSet", + procedureName = "procedure_in1_out0_return_rs_no_update", parameters = { + @StoredProcedureParameter(mode = ParameterMode.IN, type = Integer.class), + @StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, type = void.class) }) // + , + @NamedStoredProcedureQuery(name = "Dummy.procedureWith1InputAnd1OutputParameterWithResultSetWithUpdate", + procedureName = "procedure_in1_out0_return_rs_with_update", parameters = { + @StoredProcedureParameter(mode = ParameterMode.IN, type = Integer.class), + @StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, type = void.class) }) // + , + @NamedStoredProcedureQuery(name = "Dummy.procedureWith1InputAndNoOutputParameterWithUpdate", + procedureName = "procedure_in1_out0_no_return_with_update", parameters = { @StoredProcedureParameter( + mode = ParameterMode.IN, type = String.class) }) // +}) +public class Dummy { + + @Id @GeneratedValue private Integer id; + private String name; + + public Dummy() {} + + public Dummy(String name) { + this.name = name; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "Dummy [id=" + id + ", name=" + name + "]"; + } + + @Override + public int hashCode() { + return ObjectUtils.nullSafeHashCode(name); + } + + @Override + public boolean equals(Object that) { + + if (that == this) { + return true; + } + + if (that == null) { + return false; + } + + if (!(that instanceof Dummy)) { + return false; + } + + return ObjectUtils.nullSafeEquals(this.name, ((Dummy) that).name); + } +} diff --git a/src/test/java/org/springframework/data/jpa/domain/sample/User.java b/src/test/java/org/springframework/data/jpa/domain/sample/User.java index 94c7e213ca..3ca89ed801 100644 --- a/src/test/java/org/springframework/data/jpa/domain/sample/User.java +++ b/src/test/java/org/springframework/data/jpa/domain/sample/User.java @@ -1,5 +1,5 @@ /* - * Copyright 2008-2014 the original author or authors. + * Copyright 2008-2015 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. @@ -84,7 +84,7 @@ public class User { @Lob private byte[] binaryData; @ElementCollection private Set attributes; - + @Temporal(TemporalType.DATE) private Date dateOfBirth; /** @@ -367,7 +367,7 @@ public Set getAttributes() { public void setAttributes(Set attributes) { this.attributes = attributes; } - + public Date getDateOfBirth() { return dateOfBirth; } diff --git a/src/test/java/org/springframework/data/jpa/repository/EclipseLinkStoredProcedureIntegrationTests.java b/src/test/java/org/springframework/data/jpa/repository/EclipseLinkStoredProcedureIntegrationTests.java new file mode 100644 index 0000000000..c23799c387 --- /dev/null +++ b/src/test/java/org/springframework/data/jpa/repository/EclipseLinkStoredProcedureIntegrationTests.java @@ -0,0 +1,28 @@ +/* + * Copyright 2008-2014 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.jpa.repository; + +import org.springframework.context.annotation.ImportResource; +import org.springframework.test.context.ContextConfiguration; + +/** + * Testcase to run {@link StoredProcedureIntegrationTests} integration tests on top of EclipseLink. + * + * @author Thomas Darimont + */ +@ContextConfiguration(classes = { StoredProcedureIntegrationTests.Config.class }) +@ImportResource("classpath:eclipselink.xml") +public class EclipseLinkStoredProcedureIntegrationTests extends StoredProcedureIntegrationTests {} diff --git a/src/test/java/org/springframework/data/jpa/repository/OpenJpaStoredProcedureIntegrationTests.java b/src/test/java/org/springframework/data/jpa/repository/OpenJpaStoredProcedureIntegrationTests.java new file mode 100644 index 0000000000..00c24ccf1c --- /dev/null +++ b/src/test/java/org/springframework/data/jpa/repository/OpenJpaStoredProcedureIntegrationTests.java @@ -0,0 +1,31 @@ +/* + * Copyright 2015 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.jpa.repository; + +import org.junit.Ignore; +import org.springframework.context.annotation.ImportResource; +import org.springframework.test.context.ContextConfiguration; + +/** + * Test case to run {@link StoredProcedureIntegrationTests} integration tests on top of OpenJpa. This is currently not + * supported since, the OpenJPA tests need to be executed with hsqldb1 which doesn't supported stored procedures. + * + * @author Thomas Darimont + */ +@Ignore +@ContextConfiguration(classes = { StoredProcedureIntegrationTests.Config.class }) +@ImportResource("classpath:openjpa.xml") +public class OpenJpaStoredProcedureIntegrationTests extends StoredProcedureIntegrationTests {} diff --git a/src/test/java/org/springframework/data/jpa/repository/StoredProcedureIntegrationTests.java b/src/test/java/org/springframework/data/jpa/repository/StoredProcedureIntegrationTests.java new file mode 100644 index 0000000000..cce06e9ba7 --- /dev/null +++ b/src/test/java/org/springframework/data/jpa/repository/StoredProcedureIntegrationTests.java @@ -0,0 +1,214 @@ +/* + * Copyright 2015 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.jpa.repository; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; +import static org.junit.Assume.*; +import static org.springframework.data.jpa.support.EntityManagerTestUtils.*; + +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan.Filter; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; +import org.springframework.context.annotation.ImportResource; +import org.springframework.data.jpa.domain.sample.Dummy; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.data.jpa.repository.sample.DummyRepository; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + +/** + * @see scripts/schema-stored-procedures.sql for procedure definitions. + * @author Thomas Darimont + */ +@Transactional +@ContextConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +public class StoredProcedureIntegrationTests { + + @PersistenceContext EntityManager em; + @Autowired DummyRepository repository; + + Dummy dummyA; + Dummy dummyB; + Dummy dummyC; + + @Configuration + @EnableJpaRepositories(basePackageClasses = DummyRepository.class, includeFilters = { @Filter( + pattern = ".*DummyRepository", type = FilterType.REGEX) }) + @ImportResource("classpath:infrastructure.xml") + static class Config {} + + @Before + public void setup() { + + assumeTrue(currentEntityManagerIsAJpa21EntityManager(em)); + + dummyA = em.merge(new Dummy("A")); + dummyB = em.merge(new Dummy("B")); + dummyC = em.merge(new Dummy("C")); + } + + /** + * @see DATAJPA-652 + */ + @Test + public void shouldExecuteAdHocProcedureWithNoInputAnd1OutputParameter() { + assertThat(repository.adHocProcedureWithNoInputAnd1OutputParameter(), is(equalTo(42))); + } + + /** + * @see DATAJPA-652 + */ + @Test + public void shouldExecuteAdHocProcedureWith1InputAnd1OutputParameter() { + assertThat(repository.adHocProcedureWith1InputAnd1OutputParameter(23), is(equalTo(24))); + } + + /** + * @see DATAJPA-652 + */ + @Test + public void shouldExecuteAdHocProcedureWith1InputAndNoOutputParameter() { + + repository.adHocProcedureWith1InputAndNoOutputParameter(42); + + assertTrue(true); + } + + /** + * @see DATAJPA-652 + */ + @Test + public void shouldExecuteAdHocProcedureWith1InputAnd1OutputParameterWithResultSet() { + + // hibernate currently (v4.3) doesn't support returning ResultSets in output parameters + assumeFalse(currentEntityManagerIsHibernateEntityManager(em)); + + List dummies = repository.adHocProcedureWith1InputAnd1OutputParameterWithResultSet("FOO"); + + System.out.println("### Found dummies: " + dummies); + + assertThat(dummies, is(notNullValue())); + assertThat(dummies.size(), is(equalTo(3))); + } + + /** + * @see DATAJPA-652 + */ + @Test + public void shouldExecuteAdHocProcedureWith1InputAnd1OutputParameterWithResultSetWithUpdate() { + + // hibernate currently (v4.3) doesn't support returning ResultSets in output parameters + assumeFalse(currentEntityManagerIsHibernateEntityManager(em)); + + List dummies = repository.adHocProcedureWith1InputAnd1OutputParameterWithResultSetWithUpdate("FOO"); + + System.out.println("### Found dummies: " + dummies); + + assertThat(dummies, is(notNullValue())); + assertThat(dummies.size(), is(equalTo(3))); + } + + /** + * @see DATAJPA-652 + */ + @Test + public void shouldExecuteAdHocProcedureWith1InputAnd1OutputParameterWithUpdate() { + + repository.adHocProcedureWith1InputAndNoOutputParameterWithUpdate("FOO"); + + assertTrue(true); + } + + /** + * @see DATAJPA-652 + */ + @Test + public void shouldExecuteProcedureWithNoInputAnd1OutputParameter() { + assertThat(repository.procedureWithNoInputAnd1OutputParameter(), is(equalTo(42))); + } + + /** + * @see DATAJPA-652 + */ + @Test + public void shouldExecuteProcedureWith1InputAnd1OutputParameter() { + assertThat(repository.procedureWith1InputAnd1OutputParameter(23), is(equalTo(24))); + } + + /** + * @see DATAJPA-652 + */ + @Test + public void shouldExecuteProcedureWith1InputAndNoOutputParameter() { + + repository.procedureWith1InputAndNoOutputParameter(42); + + assertTrue(true); + } + + /** + * @see DATAJPA-652 + */ + @Test + public void shouldExecuteProcedureWith1InputAnd1OutputParameterWithResultSet() { + + // hibernate currently (v4.3) doesn't support returning ResultSets in output parameters + assumeFalse(currentEntityManagerIsHibernateEntityManager(em)); + + List dummies = repository.procedureWith1InputAnd1OutputParameterWithResultSet("FOO"); + + assertThat(dummies, is(notNullValue())); + assertThat(dummies.size(), is(equalTo(3))); + } + + /** + * @see DATAJPA-652 + */ + @Test + public void shouldExecuteProcedureWith1InputAnd1OutputParameterWithResultSetWithUpdate() { + + // hibernate currently (v4.3) doesn't support returning ResultSets in output parameters + assumeFalse(currentEntityManagerIsHibernateEntityManager(em)); + + List dummies = repository.procedureWith1InputAnd1OutputParameterWithResultSetWithUpdate("FOO"); + + assertThat(dummies, is(notNullValue())); + assertThat(dummies.size(), is(equalTo(3))); + } + + /** + * @see DATAJPA-652 + */ + @Test + public void shouldExecuteProcedureWith1InputAnd1OutputParameterWithUpdate() { + + repository.procedureWith1InputAndNoOutputParameterWithUpdate("FOO"); + + assertTrue(true); + } +} diff --git a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryStoredProcedureTests.java b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryStoredProcedureTests.java index 6415df777a..163a297094 100644 --- a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryStoredProcedureTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryStoredProcedureTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014 the original author or authors. + * Copyright 2014-2015 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. 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 new file mode 100644 index 0000000000..67c98399ca --- /dev/null +++ b/src/test/java/org/springframework/data/jpa/repository/sample/DummyRepository.java @@ -0,0 +1,63 @@ +/* + * Copyright 2015 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.jpa.repository.sample; + +import java.util.List; + +import org.springframework.data.jpa.domain.sample.Dummy; +import org.springframework.data.jpa.repository.query.Procedure; +import org.springframework.data.repository.CrudRepository; +import org.springframework.transaction.annotation.Transactional; + +@Transactional +public interface DummyRepository extends CrudRepository { + + @Procedure("procedure_in1_out1") + Integer adHocProcedureWith1InputAnd1OutputParameter(Integer in); + + @Procedure("procedure_in1_out0") + void adHocProcedureWith1InputAndNoOutputParameter(Integer in); + + @Procedure("procedure_in0_out1") + Integer adHocProcedureWithNoInputAnd1OutputParameter(); + + @Procedure("procedure_in1_out0_return_rs_no_update") + List adHocProcedureWith1InputAnd1OutputParameterWithResultSet(String in); + + @Procedure("procedure_in1_out0_return_rs_with_update") + List adHocProcedureWith1InputAnd1OutputParameterWithResultSetWithUpdate(String in); + + @Procedure("procedure_in1_out0_no_return_with_update") + void adHocProcedureWith1InputAndNoOutputParameterWithUpdate(String in); + + @Procedure + Integer procedureWith1InputAnd1OutputParameter(Integer in); + + @Procedure + void procedureWith1InputAndNoOutputParameter(Integer in); + + @Procedure + Integer procedureWithNoInputAnd1OutputParameter(); + + @Procedure + List procedureWith1InputAnd1OutputParameterWithResultSet(String in); + + @Procedure + List procedureWith1InputAnd1OutputParameterWithResultSetWithUpdate(String in); + + @Procedure + void procedureWith1InputAndNoOutputParameterWithUpdate(String in); +} 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 b9f2ce83a8..0dd9a2e4be 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 @@ -1,5 +1,5 @@ /* - * Copyright 2008-2014 the original author or authors. + * Copyright 2008-2015 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. diff --git a/src/test/java/org/springframework/data/jpa/support/EntityManagerTestUtils.java b/src/test/java/org/springframework/data/jpa/support/EntityManagerTestUtils.java index f1797888f9..c9494d573d 100644 --- a/src/test/java/org/springframework/data/jpa/support/EntityManagerTestUtils.java +++ b/src/test/java/org/springframework/data/jpa/support/EntityManagerTestUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2014 the original author or authors. + * Copyright 2014-2015 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. @@ -32,4 +32,8 @@ public static boolean currentEntityManagerIsAJpa21EntityManager(EntityManager em return ReflectionUtils.findMethod(((org.springframework.orm.jpa.EntityManagerProxy) em).getTargetEntityManager() .getClass(), "getEntityGraph", String.class) != null; } + + public static boolean currentEntityManagerIsHibernateEntityManager(EntityManager em) { + return em.getDelegate().getClass().getName().toLowerCase().contains("hibernate"); + } } diff --git a/src/test/resources/META-INF/persistence.xml b/src/test/resources/META-INF/persistence.xml index eac9906983..82189b1b0c 100644 --- a/src/test/resources/META-INF/persistence.xml +++ b/src/test/resources/META-INF/persistence.xml @@ -38,6 +38,7 @@ org.springframework.data.jpa.domain.sample.SpecialUser org.springframework.data.jpa.domain.sample.User org.springframework.data.jpa.domain.sample.VersionedUser + org.springframework.data.jpa.domain.sample.Dummy true @@ -46,6 +47,7 @@ org.springframework.data.jpa.domain.sample.MailSender org.springframework.data.jpa.domain.sample.MailUser org.springframework.data.jpa.domain.sample.User + org.springframework.data.jpa.domain.sample.Dummy true @@ -55,6 +57,7 @@ org.springframework.data.jpa.domain.sample.MailUser org.springframework.data.jpa.domain.sample.User org.springframework.data.jpa.repository.cdi.Person + org.springframework.data.jpa.domain.sample.Dummy true @@ -101,6 +104,7 @@ org.springframework.data.jpa.domain.sample.MailUser org.springframework.data.jpa.domain.sample.User org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformationIntegrationTests$Sample + org.springframework.data.jpa.domain.sample.Dummy true @@ -111,6 +115,7 @@ org.springframework.data.jpa.domain.sample.MailUser org.springframework.data.jpa.domain.sample.User org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformationIntegrationTests$Sample + org.springframework.data.jpa.domain.sample.Dummy true diff --git a/src/test/resources/META-INF/persistence2.xml b/src/test/resources/META-INF/persistence2.xml index f0d7af10a0..18c3c67b12 100644 --- a/src/test/resources/META-INF/persistence2.xml +++ b/src/test/resources/META-INF/persistence2.xml @@ -15,6 +15,7 @@ org.springframework.data.jpa.domain.sample.Role org.springframework.data.jpa.domain.sample.SpecialUser org.springframework.data.jpa.domain.sample.User + org.springframework.data.jpa.domain.sample.Dummy true @@ -22,7 +23,7 @@ org.springframework.data.jpa.domain.sample.AuditableUser org.springframework.data.jpa.domain.sample.AuditableRole org.springframework.data.jpa.domain.sample.Category -org.springframework.data.jpa.domain.sample.CustomAbstractPersistable + org.springframework.data.jpa.domain.sample.CustomAbstractPersistable org.springframework.data.jpa.domain.sample.MailMessage org.springframework.data.jpa.domain.sample.MailSender org.springframework.data.jpa.domain.sample.MailUser @@ -30,6 +31,7 @@ org.springframework.data.jpa.domain.sample.Role org.springframework.data.jpa.domain.sample.SpecialUser org.springframework.data.jpa.domain.sample.User + org.springframework.data.jpa.domain.sample.Dummy true diff --git a/src/test/resources/scripts/schema-stored-procedures.sql b/src/test/resources/scripts/schema-stored-procedures.sql index dee6b566c1..5e199e3409 100644 --- a/src/test/resources/scripts/schema-stored-procedures.sql +++ b/src/test/resources/scripts/schema-stored-procedures.sql @@ -5,4 +5,71 @@ CREATE procedure plus1inout (IN arg int, OUT res int) BEGIN ATOMIC set res = arg + 1; END +/; +DROP procedure IF EXISTS procedure_in1_out1 +/; +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_rs_with_update +/; +DROP procedure IF EXISTS procedure_in1_out0_no_return_with_update +/; + +DROP table dummy if exists +/; +create table dummy (id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, name VARCHAR(32)) +/; +insert into public.dummy(name) values ('A') +/; +insert into public.dummy(name) values ('B') +/; +insert into public.dummy(name) values ('C') +/; + +/; +CREATE procedure procedure_in1_out1 (IN arg int, OUT res int) +BEGIN ATOMIC +set res = arg + 1; +END +/; + +CREATE procedure procedure_in1_out0 (IN arg int) +BEGIN ATOMIC +DECLARE res int; +set res = arg + 1; +END +/; + +CREATE procedure procedure_in0_out1 (OUT res int) +BEGIN ATOMIC +set res = 42; +END +/; + +CREATE procedure procedure_in1_out0_return_rs_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; +open result; +END +/; + +CREATE procedure procedure_in1_out0_return_rs_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; +update public.dummy set name = name; +OPEN result; +END +/; + +CREATE procedure procedure_in1_out0_no_return_with_update (IN arg varchar(32)) +MODIFIES SQL DATA +BEGIN ATOMIC +update public.dummy set name = name; +END /; \ No newline at end of file