From 73f5531fcee1faeaea53b72a867017c64060a52b Mon Sep 17 00:00:00 2001 From: Jan Schatteman Date: Thu, 23 Oct 2025 23:37:54 +0200 Subject: [PATCH 1/6] HHH-19846 - Drop JUnit 4 usage: org.hibernate.orm.test.jpa.query Signed-off-by: Jan Schatteman --- .../ConstructorResultNativeQueryTest.java | 127 +- .../orm/test/jpa/query/NamedQueryTest.java | 92 +- ...ativeQueryResultTypeAutoDiscoveryTest.java | 286 ++- .../jpa/query/NullParameterQueryTest.java | 26 +- .../query/QueryParametersValidationTest.java | 102 +- .../orm/test/jpa/query/QueryTest.java | 1540 ++++++----------- ...eryWithLiteralsInSelectExpressionTest.java | 106 +- .../RegisterNamedQueryWithParameterTest.java | 2 +- .../ReuseCriteriaWithMixedParametersTest.java | 2 +- .../query/ScalarResultNativeQueryTest.java | 44 +- .../test/jpa/query/TupleNativeQueryTest.java | 602 +++---- .../jpa/query/TypedValueParametersTest.java | 1 - 12 files changed, 1138 insertions(+), 1792 deletions(-) diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ConstructorResultNativeQueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ConstructorResultNativeQueryTest.java index 55d263c9e7a4..2f6f658d0220 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ConstructorResultNativeQueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ConstructorResultNativeQueryTest.java @@ -4,8 +4,8 @@ */ package org.hibernate.orm.test.jpa.query; -import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping; -import static org.junit.Assert.assertEquals; +import static org.hibernate.testing.orm.junit.ExtraAssertions.assertTyping; +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.Date; import java.util.List; @@ -14,7 +14,6 @@ import jakarta.persistence.ColumnResult; import jakarta.persistence.ConstructorResult; import jakarta.persistence.Entity; -import jakarta.persistence.EntityManager; import jakarta.persistence.Id; import jakarta.persistence.NamedNativeQueries; import jakarta.persistence.NamedNativeQuery; @@ -25,16 +24,19 @@ import jakarta.persistence.TemporalType; import org.hibernate.dialect.OracleDialect; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; -import org.hibernate.testing.SkipForDialect; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.SkipForDialect; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; /** * @author Steve Ebersole */ -@SkipForDialect(value = OracleDialect.class, jiraKey = "HHH-10323") -public class ConstructorResultNativeQueryTest extends BaseEntityManagerFunctionalTestCase { +@SkipForDialect(dialectClass = OracleDialect.class, matchSubTypes = true, reason = "https://hibernate.atlassian.net/browse/HHH-10323") +@Jpa(annotatedClasses = {ConstructorResultNativeQueryTest.Person.class}) +public class ConstructorResultNativeQueryTest { @Entity( name = "Person" ) @SqlResultSetMappings( value = { @@ -136,85 +138,54 @@ public Person(Integer id, String name, String weight) { } } - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { Person.class }; + @AfterEach + public void cleanup(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } - @Test - public void testConstructorResultNativeQuery() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( new Person( 1, "John", new Date() ) ); - em.getTransaction().commit(); - em.close(); - - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - List results = em.createNativeQuery( - "select p.id, p.p_name from person p order by p.p_name", - "person-id-and-name" - ).getResultList(); - assertEquals( 1, results.size() ); - assertTyping( Person.class, results.get( 0 ) ); - em.getTransaction().commit(); - em.close(); - - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete from Person" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + public void testConstructorResultNativeQuery(EntityManagerFactoryScope scope) { + scope.inTransaction( em -> { + em.persist( new Person( 1, "John", new Date() ) ); + } ); + + scope.inTransaction( em -> { + List results = em.createNativeQuery( + "select p.id, p.p_name from person p order by p.p_name", + "person-id-and-name" + ).getResultList(); + assertEquals( 1, results.size() ); + assertTyping( Person.class, results.get( 0 ) ); + } ); } @Test - public void testMultipleConstructorResultNativeQuery() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( new Person( 1, "John", new Date() ) ); - em.getTransaction().commit(); - em.close(); - - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - List results = em.createNamedQuery( "person-id-and-name2" ).getResultList(); - assertEquals( 1, results.size() ); - Object[] result = assertTyping( Object[].class, results.get( 0 ) ); - assertEquals( 2, result.length ); - assertTyping( Person.class, result[0] ); - assertTyping( Person.class, result[1] ); - em.getTransaction().commit(); - em.close(); - - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete from Person" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + public void testMultipleConstructorResultNativeQuery(EntityManagerFactoryScope scope) { + scope.inTransaction( em -> { + em.persist( new Person( 1, "John", new Date() ) ); + } ); + + scope.inTransaction( em -> { + List results = em.createNamedQuery( "person-id-and-name2" ).getResultList(); + assertEquals( 1, results.size() ); + Object[] result = assertTyping( Object[].class, results.get( 0 ) ); + assertEquals( 2, result.length ); + assertTyping( Person.class, result[0] ); + assertTyping( Person.class, result[1] ); + } ); } @Test - public void testConstructorResultNativeQuerySpecifyingType() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( new Person( 1, "John", "85" ) ); - em.getTransaction().commit(); - em.close(); - - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - List results = em.createNamedQuery( "person-id-and-name-and-weight" ).getResultList(); - assertEquals( 1, results.size() ); - assertTyping( Person.class, results.get( 0 ) ); - em.getTransaction().commit(); - em.close(); - - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete from Person" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + public void testConstructorResultNativeQuerySpecifyingType(EntityManagerFactoryScope scope) { + scope.inTransaction( em -> { + em.persist( new Person( 1, "John", "85" ) ); + } ); + + scope.inTransaction( em -> { + List results = em.createNamedQuery( "person-id-and-name-and-weight" ).getResultList(); + assertEquals( 1, results.size() ); + assertTyping( Person.class, results.get( 0 ) ); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NamedQueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NamedQueryTest.java index 3d22487016d8..5cde6135946a 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NamedQueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NamedQueryTest.java @@ -15,37 +15,33 @@ import jakarta.persistence.TypedQuery; import org.assertj.core.api.InstanceOfAssertFactories; import org.hibernate.Session; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; import org.hibernate.query.NativeQuery; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThrows; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * @author Andrea Boriero */ @JiraKey(value = "HHH-11092") -public class NamedQueryTest extends BaseEntityManagerFunctionalTestCase { +@Jpa(annotatedClasses = {NamedQueryTest.Game.class}) +public class NamedQueryTest { private static final String[] GAME_TITLES = { "Halo", "Grand Theft Auto", "NetHack" }; - @Override - public Class[] getAnnotatedClasses() { - return new Class[] { Game.class }; - } - - @Before - public void setUp() + @BeforeEach + public void setUp(EntityManagerFactoryScope scope) throws Exception { - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { for ( String title : GAME_TITLES ) { Game game = new Game( title ); entityManager.persist( game ); @@ -53,17 +49,17 @@ public void setUp() } ); } - @After - public void tearDown() { - doInJPA( this::entityManagerFactory, entityManager -> { + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { entityManager.createQuery( "delete from Game" ).executeUpdate(); } ); } @Test - public void testNamedQueriesOrdinalParametersAreOneBased() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNamedQueriesOrdinalParametersAreOneBased(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Query query = entityManager.createNamedQuery( "NamedQuery" ); query.setParameter( 1, GAME_TITLES[0] ); List list = query.getResultList(); @@ -73,8 +69,8 @@ public void testNamedQueriesOrdinalParametersAreOneBased() { } @Test - public void testNamedQueryOrdinalParametersConflict() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNamedQueryOrdinalParametersConflict(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Query query = entityManager.createNamedQuery( "NamedQuery" ); query.setParameter( 1, GAME_TITLES[0] ); List list = query.getResultList(); @@ -92,8 +88,8 @@ public void testNamedQueryOrdinalParametersConflict() { } @Test - public void testNamedQueryOrdinalParametersConflict2() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNamedQueryOrdinalParametersConflict2(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Query query = entityManager.createNamedQuery( "NamedQuery" ); query.setParameter( 1, GAME_TITLES[0] ); List list = query.getResultList(); @@ -111,8 +107,8 @@ public void testNamedQueryOrdinalParametersConflict2() { } @Test - public void testNativeNamedQueriesOrdinalParametersAreOneBased() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNativeNamedQueriesOrdinalParametersAreOneBased(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Query query = entityManager.createNamedQuery( "NamedNativeQuery" ); query.setParameter( 1, GAME_TITLES[0] ); List list = query.getResultList(); @@ -122,8 +118,8 @@ public void testNativeNamedQueriesOrdinalParametersAreOneBased() { } @Test - public void testNativeNamedQueriesOrdinalParametersConflict() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNativeNamedQueriesOrdinalParametersConflict(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Query query = entityManager.createNamedQuery( "NamedNativeQuery" ); query.setParameter( 1, GAME_TITLES[0] ); List list = query.getResultList(); @@ -142,8 +138,8 @@ public void testNativeNamedQueriesOrdinalParametersConflict() { } @Test - public void testNativeNamedQueriesOrdinalParametersConflict2() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNativeNamedQueriesOrdinalParametersConflict2(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Query query = entityManager.createNamedQuery( "NamedNativeQuery" ); query.setParameter( 1, GAME_TITLES[0] ); List list = query.getResultList(); @@ -163,8 +159,8 @@ public void testNativeNamedQueriesOrdinalParametersConflict2() { @Test @JiraKey(value = "HHH-12621") - public void testNativeQueriesFromNamedQueriesDoNotShareQuerySpaces() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNativeQueriesFromNamedQueriesDoNotShareQuerySpaces(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Query originalQuery = entityManager.createNativeQuery( "select g from Game g where title = ?1" ); entityManager.getEntityManagerFactory().addNamedQuery( "myQuery", originalQuery ); @@ -182,23 +178,23 @@ public void testNativeQueriesFromNamedQueriesDoNotShareQuerySpaces() { @Test @JiraKey(value = "HHH-11413") - public void testNamedNativeQueryExceptionNoResultDefined() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNamedNativeQueryExceptionNoResultDefined(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { assertThrows( - "Named query exists but its result type is not compatible", IllegalArgumentException.class, - () -> entityManager.createNamedQuery( "NamedNativeQuery", Game.class ) + () -> entityManager.createNamedQuery( "NamedNativeQuery", Game.class ), + "Named query exists but its result type is not compatible" ); } ); } @Test @JiraKey(value = "HHH-11413") - public void testNamedQueryAddedFromTypedNativeQuery() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNamedQueryAddedFromTypedNativeQuery(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final Query query = entityManager.createNativeQuery( "select g.title from Game g where title = ?", String.class ); - entityManagerFactory().addNamedQuery( "the-query", query ); + scope.getEntityManagerFactory().addNamedQuery( "the-query", query ); final TypedQuery namedQuery = entityManager.createNamedQuery( "the-query", String.class ); namedQuery.setParameter( 1, "abc" ); @@ -208,9 +204,9 @@ public void testNamedQueryAddedFromTypedNativeQuery() { @Test @JiraKey("HHH-17566") - public void testNamedQueryAddedFromEntityNativeQuery() { + public void testNamedQueryAddedFromEntityNativeQuery(EntityManagerFactoryScope scope) { // Check that the native query works - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { final Query query = entityManager.createNativeQuery( "select g.* from Game g where title = ?", Game.class ); query.setParameter( 1, "Halo" ); @@ -221,10 +217,10 @@ public void testNamedQueryAddedFromEntityNativeQuery() { .returns( "Halo", Game::getTitle ); } ); // Check corresponding named query can be used as a typed query - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { final Query query = entityManager.createNativeQuery( "select g.* from Game g where title = ?", Game.class ); - entityManagerFactory().addNamedQuery( "the-query", query ); + scope.getEntityManagerFactory().addNamedQuery( "the-query", query ); final TypedQuery namedQuery = entityManager.createNamedQuery( "the-query", Game.class ); namedQuery.setParameter( 1, "Halo" ); @@ -237,9 +233,9 @@ public void testNamedQueryAddedFromEntityNativeQuery() { @Test @JiraKey("HHH-17566") - public void testNamedQueryAddedFromEntityNativeQueryUsedAsUntyped() { + public void testNamedQueryAddedFromEntityNativeQueryUsedAsUntyped(EntityManagerFactoryScope scope) { // Check corresponding named query can be used as an untyped query - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { final Query query = entityManager.createNativeQuery( "select g.* from Game g where title = ?", Game.class ); query.setParameter( 1, "Halo" ); @@ -250,10 +246,10 @@ public void testNamedQueryAddedFromEntityNativeQueryUsedAsUntyped() { .returns( "Halo", Game::getTitle ); } ); // Check naming the native query works - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { final Query query = entityManager.createNativeQuery( "select g.* from Game g where title = ?", Game.class ); - entityManagerFactory().addNamedQuery( "the-query", query ); + scope.getEntityManagerFactory().addNamedQuery( "the-query", query ); final Query namedQuery = entityManager.createNamedQuery( "the-query" ); namedQuery.setParameter( 1, "Halo" ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NativeQueryResultTypeAutoDiscoveryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NativeQueryResultTypeAutoDiscoveryTest.java index 5988526197e2..999af3715739 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NativeQueryResultTypeAutoDiscoveryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NativeQueryResultTypeAutoDiscoveryTest.java @@ -4,35 +4,26 @@ */ package org.hibernate.orm.test.jpa.query; -import java.math.BigDecimal; -import java.sql.Blob; -import java.sql.Clob; -import java.sql.Time; -import java.sql.Timestamp; -import java.sql.Types; -import java.time.Month; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; - +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.MappedSuperclass; import org.hibernate.Session; import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.annotations.Nationalized; import org.hibernate.cfg.AvailableSettings; import org.hibernate.community.dialect.AltibaseDialect; +import org.hibernate.community.dialect.DerbyDialect; import org.hibernate.community.dialect.FirebirdDialect; -import org.hibernate.community.dialect.InformixDialect; import org.hibernate.community.dialect.GaussDBDialect; -import org.hibernate.dialect.HANADialect; +import org.hibernate.community.dialect.InformixDialect; +import org.hibernate.community.dialect.TiDBDialect; import org.hibernate.dialect.AbstractTransactSQLDialect; import org.hibernate.dialect.CockroachDialect; import org.hibernate.dialect.DB2Dialect; -import org.hibernate.community.dialect.DerbyDialect; -import org.hibernate.dialect.Dialect; import org.hibernate.dialect.H2Dialect; +import org.hibernate.dialect.HANADialect; import org.hibernate.dialect.HSQLDialect; import org.hibernate.dialect.MariaDBDialect; import org.hibernate.dialect.MySQLDialect; @@ -40,11 +31,13 @@ import org.hibernate.dialect.PostgreSQLDialect; import org.hibernate.dialect.PostgresPlusDialect; import org.hibernate.dialect.SybaseDialect; -import org.hibernate.community.dialect.TiDBDialect; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.internal.util.ReflectHelper; -import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl; -import org.hibernate.jpa.boot.spi.Bootstrap; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.RequiresDialect; +import org.hibernate.testing.orm.junit.Setting; +import org.hibernate.testing.orm.junit.SkipForDialect; import org.hibernate.type.AbstractSingleColumnStandardBasicType; import org.hibernate.type.descriptor.java.BigDecimalJavaType; import org.hibernate.type.descriptor.java.FloatJavaType; @@ -54,27 +47,22 @@ import org.hibernate.type.descriptor.jdbc.CharJdbcType; import org.hibernate.type.descriptor.jdbc.NumericJdbcType; import org.hibernate.type.descriptor.jdbc.RealJdbcType; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; -import org.hibernate.testing.RequiresDialect; -import org.hibernate.testing.orm.junit.SkipForDialect; -import org.hibernate.testing.orm.junit.JiraKey; -import org.hibernate.testing.junit4.CustomRunner; -import org.hibernate.testing.orm.jpa.PersistenceUnitDescriptorAdapter; -import org.hibernate.testing.orm.junit.DialectContext; -import org.hibernate.testing.transaction.TransactionUtil; -import org.hibernate.testing.util.ServiceRegistryUtil; -import org.junit.After; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; -import jakarta.persistence.MappedSuperclass; +import java.math.BigDecimal; +import java.sql.Blob; +import java.sql.Clob; +import java.sql.Time; +import java.sql.Timestamp; +import java.sql.Types; +import java.time.Month; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.function.Function; import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hibernate.Hibernate.getLobHelper; /** @@ -88,43 +76,58 @@ * so that we can more easily disable testing of a particular type in a particular dialect. */ @JiraKey(value = "HHH-7318") -@RunWith(CustomRunner.class) +@Jpa( + annotatedClasses = { + NativeQueryResultTypeAutoDiscoveryTest.BigDecimalAsDecimalType.class, + NativeQueryResultTypeAutoDiscoveryTest.BigintEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.BinaryEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.BitEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.BlobEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.BooleanEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.Char255Entity.class, + NativeQueryResultTypeAutoDiscoveryTest.CharEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.ClobEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.DateEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.DecimalEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.DoubleEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.FloatEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.IntegerEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.LongvarbinaryEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.LongvarcharEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.NumericEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.NvarcharEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.RealEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.SmallintEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.TimeEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.TimestampEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.TinyintEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.VarbinaryEntity.class, + NativeQueryResultTypeAutoDiscoveryTest.VarcharEntity.class + }, + integrationSettings = {@Setting(name = AvailableSettings.NATIVE_PREFER_JDBC_DATETIME_TYPES, value = "true")} +) public class NativeQueryResultTypeAutoDiscoveryTest { - private static final Dialect DIALECT = DialectContext.getDialect(); - - private SessionFactoryImplementor entityManagerFactory; - - @After - public void cleanupEntityManagerFactory() { - if ( entityManagerFactory != null ) { - entityManagerFactory.close(); - entityManagerFactory = null; - } + @AfterEach + public void cleanup(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test @SkipForDialect(dialectClass = OracleDialect.class, reason = "Oracle maps integer types to number") - public void smallintType() { - createEntityManagerFactory(SmallintEntity.class); - doTest( SmallintEntity.class, (short)32767 ); + public void smallintType(EntityManagerFactoryScope scope) { + doTest( scope, SmallintEntity.class, (short)32767 ); } @Test - public void integerTypes() { - createEntityManagerFactory( - BigintEntity.class, - IntegerEntity.class - ); - - doTest( BigintEntity.class, 9223372036854775807L ); - doTest( IntegerEntity.class, 2147483647 ); + public void integerTypes(EntityManagerFactoryScope scope) { + doTest( scope, BigintEntity.class, 9223372036854775807L ); + doTest( scope, IntegerEntity.class, 2147483647 ); } @Test - public void doubleType() { - createEntityManagerFactory( DoubleEntity.class ); - doTest( DoubleEntity.class, 445146115151.45845 ); + public void doubleType(EntityManagerFactoryScope scope) { + doTest( scope, DoubleEntity.class, 445146115151.45845 ); } @Test @@ -132,9 +135,8 @@ public void doubleType() { @SkipForDialect(dialectClass = OracleDialect.class, reason = "No support for the bit datatype so we use number(1,0)") @SkipForDialect(dialectClass = DB2Dialect.class, majorVersion = 10, reason = "No support for the bit datatype so we use smallint") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "No support for the bit datatype so we use char(1)") - public void booleanType() { - createEntityManagerFactory( BooleanEntity.class ); - doTest( BooleanEntity.class, true ); + public void booleanType(EntityManagerFactoryScope scope) { + doTest( scope, BooleanEntity.class, true ); } @Test @@ -142,9 +144,8 @@ public void booleanType() { @SkipForDialect(dialectClass = OracleDialect.class, reason = "No support for the bit datatype so we use number(1,0)") @SkipForDialect(dialectClass = DB2Dialect.class, majorVersion = 10, reason = "No support for the bit datatype so we use smallint") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "No support for the bit datatype so we use char(1)") - public void bitType() { - createEntityManagerFactory( BitEntity.class ); - doTest( BitEntity.class, false ); + public void bitType(EntityManagerFactoryScope scope) { + doTest( scope, BitEntity.class, false ); } @Test @@ -160,18 +161,16 @@ public void bitType() { @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase maps tinyint to smallint") @SkipForDialect(dialectClass = InformixDialect.class, reason = "informix maps tinyint to smallint") @SkipForDialect(dialectClass = GaussDBDialect.class, reason = "type:resolved.Turns tinyints into shorts in result sets and advertises the type as short in the metadata") - public void tinyintType() { - createEntityManagerFactory( TinyintEntity.class ); - doTest( TinyintEntity.class, (byte)127 ); + public void tinyintType(EntityManagerFactoryScope scope) { + doTest( scope, TinyintEntity.class, (byte)127 ); } @Test @SkipForDialect(dialectClass = H2Dialect.class, reason = "Turns floats into doubles in result sets and advertises the type as double in the metadata") @SkipForDialect(dialectClass = HSQLDialect.class, reason = "Turns floats into doubles in result sets and advertises the type as double in the metadata") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Turns floats into doubles in result sets and advertises the type as double in the metadata") - public void floatType() { - createEntityManagerFactory( FloatEntity.class ); - doTest( FloatEntity.class, 15516.125f ); + public void floatType(EntityManagerFactoryScope scope) { + doTest( scope, FloatEntity.class, 15516.125f ); } @Test @@ -179,9 +178,8 @@ public void floatType() { @SkipForDialect(dialectClass = MariaDBDialect.class, reason = "Turns reals into doubles in result sets and advertises the type as double in the metadata") @SkipForDialect(dialectClass = TiDBDialect.class, reason = "Turns reals into doubles in result sets and advertises the type as double in the metadata") @SkipForDialect(dialectClass = HSQLDialect.class, reason = "Turns reals into doubles in result sets and advertises the type as double in the metadata") - public void realType() { - createEntityManagerFactory( RealEntity.class ); - doTest( RealEntity.class, 15516.125f ); + public void realType(EntityManagerFactoryScope scope) { + doTest( scope, RealEntity.class, 15516.125f ); } @Test @@ -193,11 +191,8 @@ public void realType() { @SkipForDialect(dialectClass = FirebirdDialect.class, reason = "Value is too big for the maximum allowed precision of Firebird") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Value is too big for the maximum allowed precision of Altibase") @SkipForDialect(dialectClass = InformixDialect.class, reason = "The scale exceeds the maximum precision specified") - public void numericType() { - createEntityManagerFactory( - NumericEntity.class - ); - doTest( NumericEntity.class, new BigDecimal( "5464384284258458485484848458.48465843584584684" ) ); + public void numericType(EntityManagerFactoryScope scope) { + doTest( scope, NumericEntity.class, new BigDecimal( "5464384284258458485484848458.48465843584584684" ) ); } @Test @@ -209,20 +204,14 @@ public void numericType() { @SkipForDialect(dialectClass = FirebirdDialect.class, reason = "Value is too big for the maximum allowed precision of Firebird") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Value is too big for the maximum allowed precision of Altibase") @SkipForDialect(dialectClass = InformixDialect.class, reason = "The scale exceeds the maximum precision specified") - public void decimalType() { - createEntityManagerFactory( DecimalEntity.class ); - doTest( DecimalEntity.class, new BigDecimal( "5464384284258458485484848458.48465843584584684" ) ); + public void decimalType(EntityManagerFactoryScope scope) { + doTest( scope, DecimalEntity.class, new BigDecimal( "5464384284258458485484848458.48465843584584684" ) ); } @Test - public void commonTextTypes() { - createEntityManagerFactory( - VarcharEntity.class, - NvarcharEntity.class - ); - - doTest( VarcharEntity.class, "some text" ); - doTest( NvarcharEntity.class, "some text" ); + public void commonTextTypes(EntityManagerFactoryScope scope) { + doTest( scope, VarcharEntity.class, "some text" ); + doTest( scope, NvarcharEntity.class, "some text" ); } @Test @@ -231,37 +220,26 @@ public void commonTextTypes() { @SkipForDialect(dialectClass = SybaseDialect.class, matchSubTypes = true, reason = "Sybase maps LONGVARCHAR to CLOB") @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA maps LONGVARCHAR to CLOB") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase maps LONGVARCHAR to CLOB") - public void longCharType() { - createEntityManagerFactory( - LongvarcharEntity.class - ); - - doTest( LongvarcharEntity.class, "some text" ); + public void longCharType(EntityManagerFactoryScope scope) { + doTest( scope, LongvarcharEntity.class, "some text" ); } @Test - public void charType() { - createEntityManagerFactory( CharEntity.class ); - doTest( CharEntity.class, 'c' ); + public void charType(EntityManagerFactoryScope scope) { + doTest( scope, CharEntity.class, 'c' ); } @Test // Most other dialects define java.sql.Types.CHAR as "CHAR(1)" instead of "CHAR($l)", so they ignore the length @RequiresDialect(H2Dialect.class) - public void char255Type() { - createEntityManagerFactory( Char255Entity.class ); - doTest( Char255Entity.class, "some text" ); + public void char255Type(EntityManagerFactoryScope scope) { + doTest( scope, Char255Entity.class, "some text" ); } @Test - public void binaryTypes() { - createEntityManagerFactory( - BinaryEntity.class, - VarbinaryEntity.class - ); - - doTest( BinaryEntity.class, "some text".getBytes() ); - doTest( VarbinaryEntity.class, "some text".getBytes() ); + public void binaryTypes(EntityManagerFactoryScope scope) { + doTest( scope, BinaryEntity.class, "some text".getBytes() ); + doTest( scope, VarbinaryEntity.class, "some text".getBytes() ); } @Test @@ -270,29 +248,22 @@ public void binaryTypes() { @SkipForDialect(dialectClass = SybaseDialect.class, matchSubTypes = true, reason = "Sybase maps LONGVARBINARY to BLOB") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase maps LONGVARBINARY to BLOB") @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA maps LONGVARCHAR to BLOB") - public void longBinaryType() { - createEntityManagerFactory( - LongvarbinaryEntity.class - ); - - doTest( LongvarbinaryEntity.class, "some text".getBytes() ); + public void longBinaryType(EntityManagerFactoryScope scope) { + doTest( scope, LongvarbinaryEntity.class, "some text".getBytes() ); } @Test // Lobs are apparently handled differently in other dialects, queries return Strings instead of the CLOB/BLOB @RequiresDialect(H2Dialect.class) - public void lobTypes() { - createEntityManagerFactory( - ClobEntity.class, - BlobEntity.class - ); - + public void lobTypes(EntityManagerFactoryScope scope) { doTest( + scope, ClobEntity.class, Clob.class, session -> getLobHelper().createClob( "some text" ) ); doTest( + scope, BlobEntity.class, Blob.class, session -> getLobHelper().createBlob( "some text".getBytes() ) @@ -305,49 +276,39 @@ public void lobTypes() { @SkipForDialect(dialectClass = SybaseDialect.class, reason = "Sybase maps DATE and TIME to TIMESTAMP", matchSubTypes = true) @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "Altibase maps DATE and TIME to TIMESTAMP") @SkipForDialect(dialectClass = GaussDBDialect.class, reason = "type:resolved.GaussDB's Oracle model maps DATE and TIME to TIMESTAMP") - public void dateTimeTypes() { - createEntityManagerFactory( - DateEntity.class, - TimeEntity.class - ); - + public void dateTimeTypes(EntityManagerFactoryScope scope) { ZonedDateTime zonedDateTime = ZonedDateTime.of( 2014, Month.NOVEMBER.getValue(), 15, 18, 0, 0, 0, ZoneId.of( "UTC" ) ); - doTest( DateEntity.class, new java.sql.Date( zonedDateTime.toInstant().toEpochMilli() ) ); - doTest( TimeEntity.class, new Time( zonedDateTime.toLocalTime().toNanoOfDay() / 1000 ) ); + doTest( scope, DateEntity.class, new java.sql.Date( zonedDateTime.toInstant().toEpochMilli() ) ); + doTest( scope, TimeEntity.class, new Time( zonedDateTime.toLocalTime().toNanoOfDay() / 1000 ) ); } @Test - public void timestampType() { - createEntityManagerFactory( - TimestampEntity.class - ); - + public void timestampType(EntityManagerFactoryScope scope) { ZonedDateTime zonedDateTime = ZonedDateTime.of( 2014, Month.NOVEMBER.getValue(), 15, 18, 0, 0, 0, ZoneId.of( "UTC" ) ); - doTest( TimestampEntity.class, new Timestamp( zonedDateTime.toInstant().toEpochMilli() ) ); + doTest( scope, TimestampEntity.class, new Timestamp( zonedDateTime.toInstant().toEpochMilli() ) ); } - private , T> void doTest(Class entityType, T testedValue) { - this.doTest( entityType, ReflectHelper.getClass( testedValue ), ignored -> testedValue ); + private , T> void doTest(EntityManagerFactoryScope scope, Class entityType, T testedValue) { + this.doTest( scope, entityType, ReflectHelper.getClass( testedValue ), ignored -> testedValue ); } - private , T> void doTest(Class entityType, Class testedValueClass, - Function testedValueProvider) { - String entityName = entityManagerFactory.getMetamodel().entity( entityType ).getName(); + private , T> void doTest(EntityManagerFactoryScope scope, Class entityType, Class testedValueClass, + Function testedValueProvider) { // Expecting all entities to use the entity name as table name in these tests, because it's simpler - String tableName = entityName; + String tableName = scope.getEntityManagerFactory().getMetamodel().entity( entityType ).getName(); // Create a single record in the test database. - TransactionUtil.doInJPA( () -> entityManagerFactory, em -> { + scope.inTransaction( em -> { try { E entity = entityType.getConstructor().newInstance(); T testedValue = testedValueProvider.apply( em.unwrap( Session.class ) ); @@ -362,37 +323,16 @@ private , T> void doTest(Class entityType, Class entityManagerFactory, em -> { + scope.inTransaction( em -> { // Execute a native query to get the entity that was just created. Object result = em.createNativeQuery( "SELECT testedProperty FROM " + tableName - ) - .getSingleResult(); + ).getSingleResult(); - Assert.assertThat( result, instanceOf( testedValueClass ) ); + assertThat( result, instanceOf( testedValueClass ) ); } ); } - private void createEntityManagerFactory(Class ... entityTypes) { - cleanupEntityManagerFactory(); - EntityManagerFactoryBuilderImpl entityManagerFactoryBuilder = - (EntityManagerFactoryBuilderImpl) Bootstrap.getEntityManagerFactoryBuilder( - new PersistenceUnitDescriptorAdapter(), - buildSettings( entityTypes ) - ); - entityManagerFactory = entityManagerFactoryBuilder.build().unwrap( SessionFactoryImplementor.class ); - } - - private Map buildSettings(Class ... entityTypes) { - Map settings = new HashMap<>(); - settings.put( AvailableSettings.NATIVE_PREFER_JDBC_DATETIME_TYPES, "true" ); - settings.put( AvailableSettings.HBM2DDL_AUTO, "create-drop" ); - settings.put( AvailableSettings.DIALECT, DIALECT.getClass().getName() ); - settings.put( AvailableSettings.LOADED_CLASSES, Arrays.asList( entityTypes ) ); - ServiceRegistryUtil.applySettings( settings ); - return settings; - } - @MappedSuperclass static abstract class TestedEntity { private Long id; diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NullParameterQueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NullParameterQueryTest.java index 7a1be52c6195..2aef63c60ec4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NullParameterQueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/NullParameterQueryTest.java @@ -8,37 +8,29 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.Test; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * @author Vlad Mihalcea * @see JPA-31 */ @JiraKey(value = "JPA-31") -public class NullParameterQueryTest extends BaseEntityManagerFunctionalTestCase { - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { - Event.class - }; - } +@Jpa(annotatedClasses = {NullParameterQueryTest.Event.class}) +public class NullParameterQueryTest { @Test - public void test() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void test(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Event event = new Event(); - entityManager.persist( event ); } ); - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { Event event = entityManager.createQuery( "select e " + "from Event e " + diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryParametersValidationTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryParametersValidationTest.java index 37e689046094..80932e0088fd 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryParametersValidationTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryParametersValidationTest.java @@ -4,73 +4,61 @@ */ package org.hibernate.orm.test.jpa.query; -import java.io.Serializable; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Types; -import java.util.Map; -import java.util.Objects; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import org.hibernate.HibernateException; import org.hibernate.annotations.Type; import org.hibernate.cfg.AvailableSettings; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.Setting; import org.hibernate.type.descriptor.WrapperOptions; import org.hibernate.usertype.UserType; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; - -import jakarta.persistence.Entity; -import jakarta.persistence.EntityManager; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import java.io.Serializable; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.Objects; /** * @author Andrea Boriero */ -public class QueryParametersValidationTest extends BaseEntityManagerFunctionalTestCase { - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] {TestEntity.class}; - } - - @Override - protected void addConfigOptions(Map options) { - options.put( AvailableSettings.JPA_LOAD_BY_ID_COMPLIANCE, "true" ); - } +@Jpa( + annotatedClasses = {QueryParametersValidationTest.TestEntity.class}, + integrationSettings = {@Setting(name = AvailableSettings.JPA_LOAD_BY_ID_COMPLIANCE, value = "true")} +) +public class QueryParametersValidationTest { @JiraKey(value = "HHH-11397") - @Test(expected = IllegalArgumentException.class) - public void setParameterWithWrongTypeShouldThrowIllegalArgumentException() { - final EntityManager entityManager = entityManagerFactory().createEntityManager(); - try { - entityManager.createQuery( "select e from TestEntity e where e.id = :id" ).setParameter( "id", 1 ); - } - finally { - entityManager.close(); - } + @Test + public void setParameterWithWrongTypeShouldThrowIllegalArgumentException(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { + Assertions.assertThrows( + IllegalArgumentException.class, + () -> entityManager.createQuery( "select e from TestEntity e where e.id = :id" ).setParameter( "id", 1 ) + ); + } ); } @Test - public void setParameterWithCorrectTypeShouldNotThrowIllegalArgumentException() { - final EntityManager entityManager = entityManagerFactory().createEntityManager(); - try { + public void setParameterWithCorrectTypeShouldNotThrowIllegalArgumentException(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { entityManager.createQuery( "select e from TestEntity e where e.id = :id" ).setParameter( "id", 1L ); - } - finally { - entityManager.close(); - } + } ); } @Test @JiraKey(value = "HHH-11971") - public void setPrimitiveParameterShouldNotThrowExceptions() { - final EntityManager entityManager = entityManagerFactory().createEntityManager(); - try { + public void setPrimitiveParameterShouldNotThrowExceptions(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { entityManager.createQuery( "select e from TestEntity e where e.active = :active" ).setParameter( "active", true @@ -79,22 +67,18 @@ public void setPrimitiveParameterShouldNotThrowExceptions() { "active", Boolean.TRUE ); - } - finally { - entityManager.close(); - } + } ); } - @Test(expected = IllegalArgumentException.class) + @Test @JiraKey( value = "HHH-11971") - public void setWrongPrimitiveParameterShouldThrowIllegalArgumentException() { - final EntityManager entityManager = entityManagerFactory().createEntityManager(); - try { - entityManager.createQuery( "select e from TestEntity e where e.active = :active" ).setParameter( "active", 'c' ); - } - finally { - entityManager.close(); - } + public void setWrongPrimitiveParameterShouldThrowIllegalArgumentException(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { + Assertions.assertThrows( + IllegalArgumentException.class, + () -> entityManager.createQuery( "select e from TestEntity e where e.active = :active" ).setParameter( "active", 'c' ) + ); + } ); } @Entity(name = "TestEntity") diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryTest.java index 9e9b7decb9ef..05f8358037d2 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryTest.java @@ -4,15 +4,8 @@ */ package org.hibernate.orm.test.jpa.query; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.List; -import java.util.Map; import jakarta.persistence.CacheRetrieveMode; import jakarta.persistence.CacheStoreMode; -import jakarta.persistence.EntityManager; import jakarta.persistence.NoResultException; import jakarta.persistence.NonUniqueResultException; import jakarta.persistence.Parameter; @@ -21,40 +14,42 @@ import jakarta.persistence.TemporalType; import jakarta.persistence.Tuple; import jakarta.persistence.TypedQuery; - import org.hibernate.Hibernate; import org.hibernate.QueryException; -import org.hibernate.cfg.AvailableSettings; +import org.hibernate.SessionFactory; +import org.hibernate.community.dialect.DerbyDialect; +import org.hibernate.community.dialect.GaussDBDialect; import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.CockroachDialect; import org.hibernate.dialect.DB2Dialect; -import org.hibernate.community.dialect.DerbyDialect; -import org.hibernate.community.dialect.GaussDBDialect; import org.hibernate.dialect.OracleDialect; import org.hibernate.dialect.PostgreSQLDialect; import org.hibernate.dialect.PostgresPlusDialect; import org.hibernate.dialect.SybaseDialect; -import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; import org.hibernate.orm.test.jpa.Distributor; import org.hibernate.orm.test.jpa.Item; import org.hibernate.orm.test.jpa.Wallet; import org.hibernate.stat.Statistics; - -import org.hibernate.testing.SkipForDialect; -import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.Jira; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; -import junit.framework.Assert; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.SkipForDialect; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; -import static junit.framework.Assert.assertNull; -import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.hibernate.testing.orm.junit.ExtraAssertions.assertTyping; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author Emmanuel Bernard @@ -62,123 +57,84 @@ * @author Chris Cranford * @author Yanming Zhou */ -public class QueryTest extends BaseEntityManagerFunctionalTestCase { - @Override - public Class[] getAnnotatedClasses() { - return new Class[] { +@Jpa( + annotatedClasses = { Item.class, Distributor.class, Wallet.class, Employee.class, Contractor.class - }; - } - - @Override - @SuppressWarnings("unchecked") - protected void addConfigOptions(Map options) { - super.addConfigOptions( options ); - options.put( AvailableSettings.GENERATE_STATISTICS, "true" ); + }, + generateStatistics = true +) +public class QueryTest { + + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test @JiraKey(value = "HHH-7192") - public void testTypedManipulationQueryError() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - try { - em.createQuery( "delete Item", Item.class ); - fail(); - } - catch (IllegalArgumentException expected) { - //expected - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - } - - try { - em.createQuery( "update Item i set i.name = 'someName'", Item.class ); - fail(); - } - catch (IllegalArgumentException expected) { - //expected - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + public void testTypedManipulationQueryError(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> entityManager.createQuery( "delete Item", Item.class ) + ); + assertThrows( + IllegalArgumentException.class, + () -> entityManager.createQuery( "update Item i set i.name = 'someName'", Item.class ) + ); + } ); } @Test - public void testPagedQuery() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testPagedQuery(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); + entityManager.persist( item ); item = new Item( "Computer", "Apple II" ); - em.persist( item ); - Query q = em.createQuery( "select i from " + Item.class.getName() + " i where i.name like :itemName" ); + entityManager.persist( item ); + Query q = entityManager.createQuery( "select i from " + Item.class.getName() + " i where i.name like :itemName", Item.class ); q.setParameter( "itemName", "%" ); q.setMaxResults( 1 ); q.getSingleResult(); - q = em.createQuery( "select i from Item i where i.name like :itemName" ); + q = entityManager.createQuery( "select i from Item i where i.name like :itemName", Item.class ); q.setParameter( "itemName", "%" ); q.setFirstResult( 1 ); q.setMaxResults( 1 ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testNullPositionalParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testNullPositionalParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); - Query q = em.createQuery( "from Item i where i.intVal=?1" ); + entityManager.persist( item ); + TypedQuery q = entityManager.createQuery( "from Item i where i.intVal=?1", Item.class ); q.setParameter( 1, null ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null and ?1 is null" ); + q = entityManager.createQuery( "from Item i where i.intVal is null and ?1 is null", Item.class ); q.setParameter( 1, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null or i.intVal = ?1" ); + q = entityManager.createQuery( "from Item i where i.intVal is null or i.intVal = ?1", Item.class ); q.setParameter( 1, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testNullPositionalParameterParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testNullPositionalParameterParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); - Query q = em.createQuery( "from Item i where i.intVal=?1" ); - Parameter p = new Parameter() { + entityManager.persist( item ); + TypedQuery q = entityManager.createQuery( "from Item i where i.intVal=?1", Item.class ); + Parameter p = new Parameter<>() { @Override public String getName() { return null; @@ -190,41 +146,32 @@ public Integer getPosition() { } @Override - public Class getParameterType() { + public Class getParameterType() { return Integer.class; } }; q.setParameter( p, null ); - Parameter pGotten = q.getParameter( p.getPosition() ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null and ?1 is null" ); + q = entityManager.createQuery( "from Item i where i.intVal is null and ?1 is null", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null or i.intVal = ?1" ); + q = entityManager.createQuery( "from Item i where i.intVal is null or i.intVal = ?1", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testNullPositionalParameterParameterIncompatible() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testNullPositionalParameterParameterIncompatible(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); - Query q = em.createQuery( "from Item i where i.intVal=?1" ); - Parameter p = new Parameter() { + entityManager.persist( item ); + TypedQuery q = entityManager.createQuery( "from Item i where i.intVal=?1", Item.class ); + Parameter p = new Parameter<>() { @Override public String getName() { return null; @@ -236,70 +183,53 @@ public Integer getPosition() { } @Override - public Class getParameterType() { + public Class getParameterType() { return Long.class; } }; q.setParameter( p, null ); - Parameter pGotten = q.getParameter( p.getPosition() ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null and ?1 is null" ); + q = entityManager.createQuery( "from Item i where i.intVal is null and ?1 is null", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null or i.intVal = ?1" ); + q = entityManager.createQuery( "from Item i where i.intVal is null or i.intVal = ?1", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testNullNamedParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testNullNamedParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); - Query q = em.createQuery( "from Item i where i.intVal=:iVal" ); + entityManager.persist( item ); + TypedQuery q = entityManager.createQuery( "from Item i where i.intVal=:iVal", Item.class ); q.setParameter( "iVal", null ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null and :iVal is null" ); + q = entityManager.createQuery( "from Item i where i.intVal is null and :iVal is null", Item.class ); q.setParameter( "iVal", null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null or i.intVal = :iVal" ); + q = entityManager.createQuery( "from Item i where i.intVal is null or i.intVal = :iVal", Item.class ); q.setParameter( "iVal", null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testNullNamedParameterParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testNullNamedParameterParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); - Query q = em.createQuery( "from Item i where i.intVal=:iVal" ); - Parameter p = new Parameter() { + entityManager.persist( item ); + TypedQuery q = entityManager.createQuery( "from Item i where i.intVal=:iVal", Item.class ); + Parameter p = new Parameter<>() { @Override public String getName() { return "iVal"; @@ -311,40 +241,32 @@ public Integer getPosition() { } @Override - public Class getParameterType() { + public Class getParameterType() { return Integer.class; } }; q.setParameter( p, null ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null and :iVal is null" ); + q = entityManager.createQuery( "from Item i where i.intVal is null and :iVal is null", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null or i.intVal = :iVal" ); + q = entityManager.createQuery( "from Item i where i.intVal is null or i.intVal = :iVal", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testNullNamedParameterParameterIncompatible() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testNullNamedParameterParameterIncompatible(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); - Query q = em.createQuery( "from Item i where i.intVal=:iVal" ); - Parameter p = new Parameter() { + entityManager.persist( item ); + TypedQuery q = entityManager.createQuery( "from Item i where i.intVal=:iVal", Item.class ); + Parameter p = new Parameter<>() { @Override public String getName() { return "iVal"; @@ -356,84 +278,70 @@ public Integer getPosition() { } @Override - public Class getParameterType() { + public Class getParameterType() { return Long.class; } }; q.setParameter( p, null ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null and :iVal is null" ); + q = entityManager.createQuery( "from Item i where i.intVal is null and :iVal is null", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createQuery( "from Item i where i.intVal is null or i.intVal = :iVal" ); + q = entityManager.createQuery( "from Item i where i.intVal is null or i.intVal = :iVal", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - @SkipForDialect(value = PostgreSQLDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = GaussDBDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = PostgresPlusDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = CockroachDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = InformixDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - public void testNativeQueryNullPositionalParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + @SkipForDialect(dialectClass = PostgreSQLDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = GaussDBDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = PostgresPlusDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = CockroachDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = InformixDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + public void testNativeQueryNullPositionalParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); + entityManager.persist( item ); // native queries don't seem to flush by default ?!? - em.flush(); - Query q = em.createNativeQuery( "select * from Item i where i.int_val=?" ); + entityManager.flush(); + + Query q = entityManager.createNativeQuery( "select * from Item i where i.int_val=?", Item.class ); q.setParameter( 1, null ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createNativeQuery( "select * from Item i where i.int_val is null and ? is null" ); + q = entityManager.createNativeQuery( "select * from Item i where i.int_val is null and ? is null", Item.class ); q.setParameter( 1, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createNativeQuery( "select * from Item i where i.int_val is null or i.int_val = ?" ); + q = entityManager.createNativeQuery( "select * from Item i where i.int_val is null or i.int_val = ?", Item.class ); q.setParameter(1, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test @JiraKey(value = "HHH-10161") - @SkipForDialect(value = PostgreSQLDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = GaussDBDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = PostgresPlusDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = CockroachDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = InformixDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - public void testNativeQueryNullPositionalParameterParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + @SkipForDialect(dialectClass = PostgreSQLDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = GaussDBDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = PostgresPlusDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = CockroachDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = InformixDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + public void testNativeQueryNullPositionalParameterParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); + entityManager.persist( item ); // native queries don't seem to flush by default ?!? - em.flush(); - Query q = em.createNativeQuery( "select * from Item i where i.int_val=?" ); - Parameter p = new Parameter() { + entityManager.flush(); + + Query q = entityManager.createNativeQuery( "select * from Item i where i.int_val=?", Item.class ); + Parameter p = new Parameter<>() { @Override public String getName() { return null; @@ -445,85 +353,70 @@ public Integer getPosition() { } @Override - public Class getParameterType() { + public Class getParameterType() { return Integer.class; } }; q.setParameter( p, null ); - Parameter pGotten = q.getParameter( p.getPosition() ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createNativeQuery( "select * from Item i where i.int_val is null and ? is null" ); + q = entityManager.createNativeQuery( "select * from Item i where i.int_val is null and ? is null", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createNativeQuery( "select * from Item i where i.int_val is null or i.int_val = ?" ); + q = entityManager.createNativeQuery( "select * from Item i where i.int_val is null or i.int_val = ?", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - @SkipForDialect(value = PostgreSQLDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = GaussDBDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = PostgresPlusDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = CockroachDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = InformixDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - public void testNativeQueryNullNamedParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + @SkipForDialect(dialectClass = PostgreSQLDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = GaussDBDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = PostgresPlusDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = CockroachDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = InformixDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + public void testNativeQueryNullNamedParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); + entityManager.persist( item ); // native queries don't seem to flush by default ?!? - em.flush(); - Query q = em.createNativeQuery( "select * from Item i where i.int_val=:iVal" ); + entityManager.flush(); + + Query q = entityManager.createNativeQuery( "select * from Item i where i.int_val=:iVal", Item.class ); q.setParameter( "iVal", null ); - List results = q.getResultList(); + List results = q.getResultList(); // null != null assertEquals( 0, results.size() ); - q = em.createNativeQuery( "select * from Item i where (i.int_val is null) and (:iVal is null)" ); + q = entityManager.createNativeQuery( "select * from Item i where (i.int_val is null) and (:iVal is null)", Item.class ); q.setParameter( "iVal", null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createNativeQuery( "select * from Item i where i.int_val is null or i.int_val = :iVal" ); + q = entityManager.createNativeQuery( "select * from Item i where i.int_val is null or i.int_val = :iVal", Item.class ); q.setParameter( "iVal", null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test @JiraKey(value = "HHH-10161") - @SkipForDialect(value = PostgreSQLDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = GaussDBDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = PostgresPlusDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = CockroachDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - @SkipForDialect(value = InformixDialect.class, jiraKey = "HHH-10312", comment = "Cannot determine the parameter types and bind type is unknown because the value is null") - public void testNativeQueryNullNamedParameterParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + @SkipForDialect(dialectClass = PostgreSQLDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = GaussDBDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = PostgresPlusDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = CockroachDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + @SkipForDialect(dialectClass = InformixDialect.class, matchSubTypes = true, reason = "HHH-10312: Cannot determine the parameter types and bind type is unknown because the value is null") + public void testNativeQueryNullNamedParameterParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); + entityManager.persist( item ); // native queries don't seem to flush by default ?!? - em.flush(); - Query q = em.createNativeQuery( "select * from Item i where i.int_val=:iVal" ); - Parameter p = new Parameter() { + entityManager.flush(); + + Query q = entityManager.createNativeQuery( "select * from Item i where i.int_val=:iVal", Item.class ); + Parameter p = new Parameter<>() { @Override public String getName() { return "iVal"; @@ -535,199 +428,140 @@ public Integer getPosition() { } @Override - public Class getParameterType() { + public Class getParameterType() { return Integer.class; } }; q.setParameter( p, null ); - Parameter pGotten = q.getParameter( p.getName() ); - List results = q.getResultList(); + List results = q.getResultList(); assertEquals( 0, results.size() ); - q = em.createNativeQuery( "select * from Item i where (i.int_val is null) and (:iVal is null)" ); + q = entityManager.createNativeQuery( "select * from Item i where (i.int_val is null) and (:iVal is null)", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - q = em.createNativeQuery( "select * from Item i where i.int_val is null or i.int_val = :iVal" ); + q = entityManager.createNativeQuery( "select * from Item i where i.int_val is null or i.int_val = :iVal", Item.class ); q.setParameter( p, null ); results = q.getResultList(); assertEquals( 1, results.size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test @JiraKey("HHH-18033") - public void testQueryContainsQuotedSemicolonWithLimit() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( new Item( "Mouse;", "Micro$oft mouse" ) ); + public void testQueryContainsQuotedSemicolonWithLimit(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + + entityManager.persist( new Item( "Mouse;", "Micro$oft mouse" ) ); - Query q = em.createQuery( "from Item where name like '%;%'" ).setMaxResults(10); + TypedQuery q = entityManager.createQuery( "from Item where name like '%;%'", Item.class ).setMaxResults(10); assertEquals( 1, q.getResultList().size() ); - q = em.createQuery( "from Item where name like '%;%' " ).setMaxResults(10); + q = entityManager.createQuery( "from Item where name like '%;%' ", Item.class ).setMaxResults(10); assertEquals( 1, q.getResultList().size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test @JiraKey("HHH-18033") - public void testNativeQueryContainsQuotedSemicolonWithLimit() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( new Item( "Mouse;", "Micro$oft mouse" ) ); + public void testNativeQueryContainsQuotedSemicolonWithLimit(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { - Query q = em.createNativeQuery( "select * from Item where name like '%;%'" ).setMaxResults(10); + entityManager.persist( new Item( "Mouse;", "Micro$oft mouse" ) ); + + Query q = entityManager.createNativeQuery( "select * from Item where name like '%;%'", Item.class ).setMaxResults(10); assertEquals( 1, q.getResultList().size() ); - q = em.createNativeQuery( "select * from Item where name like '%;%' " ).setMaxResults(10); + q = entityManager.createNativeQuery( "select * from Item where name like '%;%' ", Item.class ).setMaxResults(10); assertEquals( 1, q.getResultList().size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test @JiraKey("HHH-18033") - @SkipForDialect(value = OracleDialect.class, comment = "Doesn't support semicolon as ending of statement") - @SkipForDialect(value = SybaseDialect.class, comment = "Doesn't support semicolon as ending of statement") - @SkipForDialect(value = DerbyDialect.class, comment = "Doesn't support semicolon as ending of statement") - @SkipForDialect(value = DB2Dialect.class, comment = "Doesn't support semicolon as ending of statement") - public void testNativeQueryContainsQuotedSemicolonAndEndsWithSemicolonWithLimit() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( new Item( "Mouse;", "Micro$oft mouse" ) ); - - Query q = em.createNativeQuery( "select * from Item where name like '%;%';" ).setMaxResults(10); + @SkipForDialect(dialectClass = OracleDialect.class, matchSubTypes = true, reason = "Doesn't support semicolon as ending of statement") + @SkipForDialect(dialectClass = SybaseDialect.class, matchSubTypes = true, reason = "Doesn't support semicolon as ending of statement") + @SkipForDialect(dialectClass = DerbyDialect.class, matchSubTypes = true, reason = "Doesn't support semicolon as ending of statement") + @SkipForDialect(dialectClass = DB2Dialect.class, matchSubTypes = true, reason = "Doesn't support semicolon as ending of statement") + public void testNativeQueryContainsQuotedSemicolonAndEndsWithSemicolonWithLimit(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + + entityManager.persist( new Item( "Mouse;", "Micro$oft mouse" ) ); + + Query q = entityManager.createNativeQuery( "select * from Item where name like '%;%';", Item.class ).setMaxResults(10); assertEquals( 1, q.getResultList().size() ); - q = em.createNativeQuery( "select * from Item where name like '%;%' ; " ).setMaxResults(10); + q = entityManager.createNativeQuery( "select * from Item where name like '%;%' ; ", Item.class ).setMaxResults(10); assertEquals( 1, q.getResultList().size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testAggregationReturnType() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testAggregationReturnType(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); + entityManager.persist( item ); item = new Item( "Computer", "Apple II" ); - em.persist( item ); - Query q = em.createQuery( "select count(i) from Item i where i.name like :itemName" ); + entityManager.persist( item ); + Query q = entityManager.createQuery( "select count(i) from Item i where i.name like :itemName" ); q.setParameter( "itemName", "%" ); - assertTrue( q.getSingleResult() instanceof Long ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + assertInstanceOf( Long.class, q.getSingleResult() ); + } ); } @Test - public void testTypeExpression() throws Exception { - final EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testTypeExpression(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final Employee employee = new Employee( "Lukasz", 100.0 ); - em.persist( employee ); + entityManager.persist( employee ); final Contractor contractor = new Contractor( "Kinga", 100.0, "Microsoft" ); - em.persist( contractor ); - final Query q = em.createQuery( "SELECT e FROM Employee e where TYPE(e) <> Contractor" ); - final List result = q.getResultList(); + entityManager.persist( contractor ); + final TypedQuery q = entityManager.createQuery( "SELECT e FROM Employee e where TYPE(e) <> Contractor", Employee.class ); + final List result = q.getResultList(); assertNotNull( result ); - assertEquals( Arrays.asList( employee ), result ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + assertEquals( List.of( employee ), result ); + } ); } @Test @JiraKey(value = "HHH_7407") - public void testMultipleParameterLists() throws Exception { + public void testMultipleParameterLists(EntityManagerFactoryScope scope) { final Item item = new Item( "Mouse", "Micro$oft mouse" ); final Item item2 = new Item( "Computer", "Dell computer" ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - em.persist( item2 ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - + scope.inTransaction( entityManager -> { + entityManager.persist( item ); + entityManager.persist( item2 ); + assertTrue( entityManager.contains( item ) ); + } ); - List names = Arrays.asList( item.getName() ); - Query q = em.createQuery( "select item from Item item where item.name in :names or item.name in :names2" ); + scope.inTransaction( entityManager -> { + List names = List.of( item.getName() ); + TypedQuery q = entityManager.createQuery( + "select item from Item item where item.name in :names or item.name in :names2", Item.class ); q.setParameter( "names", names ); q.setParameter( "names2", names ); - List result = q.getResultList(); + List result = q.getResultList(); assertNotNull( result ); assertEquals( 1, result.size() ); - List descrs = Arrays.asList( item.getDescr() ); - q = em.createQuery( - "select item from Item item where item.name in :names and ( item.descr is null or item.descr in :descrs )" ); + List descrs = List.of( item.getDescr() ); + q = entityManager.createQuery( + "select item from Item item where item.name in :names and ( item.descr is null or item.descr in :descrs )", + Item.class ); q.setParameter( "names", names ); q.setParameter( "descrs", descrs ); result = q.getResultList(); assertNotNull( result ); assertEquals( 1, result.size() ); - - em.getTransaction().begin(); - em.remove( em.getReference( Item.class, item.getName() ) ); - em.remove( em.getReference( Item.class, item2.getName() ) ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test @JiraKey(value = "HHH_8949") - public void testCacheStoreAndRetrieveModeParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - Query query = em.createQuery( "select item from Item item" ); + public void testCacheStoreAndRetrieveModeParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + + Query query = entityManager.createQuery( "select item from Item item", Item.class ); query.getHints().clear(); @@ -745,90 +579,67 @@ public void testCacheStoreAndRetrieveModeParameter() throws Exception { assertEquals( CacheRetrieveMode.USE, query.getHints().get( "jakarta.persistence.cache.retrieveMode" ) ); assertEquals( CacheStoreMode.REFRESH, query.getHints().get( "jakarta.persistence.cache.storeMode" ) ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testJpaPositionalParameters() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - Query query = em.createQuery( "from Item item where item.name =?1 or item.descr = ?1" ); - Parameter p1 = query.getParameter( 1 ); - Assert.assertNotNull( p1 ); - Assert.assertNotNull( p1.getPosition() ); - Assert.assertNull( p1.getName() ); - - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + public void testJpaPositionalParameters(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + + Query query = entityManager.createQuery( "from Item item where item.name =?1 or item.descr = ?1", Item.class ); + Parameter p1 = query.getParameter( 1 ); + assertNotNull( p1 ); + assertNotNull( p1.getPosition() ); + assertNull( p1.getName() ); + + } ); } @Test @JiraKey(value = "HHH-12290") - public void testParameterCollectionAndPositional() { + public void testParameterCollectionAndPositional(EntityManagerFactoryScope scope) { final Item item = new Item( "Mouse", "Microsoft mouse" ); final Item item2 = new Item( "Computer", "Dell computer" ); - - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { entityManager.persist( item ); entityManager.persist( item2 ); assertTrue( entityManager.contains( item ) ); } ); - doInJPA( this::entityManagerFactory, entityManager -> { - Query q = entityManager.createQuery( "select item from Item item where item.name in ?1 and item.descr = ?2" ); - List params = new ArrayList(); + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( "select item from Item item where item.name in ?1 and item.descr = ?2", Item.class ); + List params = new ArrayList<>(); params.add( item.getName() ); params.add( item2.getName() ); q.setParameter( 1, params ); q.setParameter( 2, item2.getDescr() ); - List result = q.getResultList(); + List result = q.getResultList(); assertNotNull( result ); assertEquals( 1, result.size() ); } ); - } @Test @JiraKey(value = "HHH-12290") - public void testParameterCollectionParenthesesAndPositional() { + public void testParameterCollectionParenthesesAndPositional(EntityManagerFactoryScope scope) { final Item item = new Item( "Mouse", "Microsoft mouse" ); final Item item2 = new Item( "Computer", "Dell computer" ); - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { entityManager.persist( item ); entityManager.persist( item2 ); assertTrue( entityManager.contains( item ) ); } ); - doInJPA( this::entityManagerFactory, entityManager -> { - Query q = entityManager.createQuery( - "select item from Item item where item.name in (?1) and item.descr = ?2" ); - List params = new ArrayList(); + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( + "select item from Item item where item.name in (?1) and item.descr = ?2", Item.class ); + List params = new ArrayList<>(); params.add( item.getName() ); params.add( item2.getName() ); q.setParameter( 1, params ); q.setParameter( 2, item2.getDescr() ); - List result = q.getResultList(); + List result = q.getResultList(); assertNotNull( result ); assertEquals( 1, result.size() ); } ); @@ -836,55 +647,53 @@ public void testParameterCollectionParenthesesAndPositional() { @Test @JiraKey(value = "HHH-12290") - public void testParameterCollectionSingletonParenthesesAndPositional() { + public void testParameterCollectionSingletonParenthesesAndPositional(EntityManagerFactoryScope scope) { final Item item = new Item( "Mouse", "Microsoft mouse" ); final Item item2 = new Item( "Computer", "Dell computer" ); - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { entityManager.persist( item ); entityManager.persist( item2 ); assertTrue( entityManager.contains( item ) ); } ); - doInJPA( this::entityManagerFactory, entityManager -> { - Query q = entityManager.createQuery( - "select item from Item item where item.name in (?1) and item.descr = ?2" ); - List params = new ArrayList(); + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( + "select item from Item item where item.name in (?1) and item.descr = ?2", Item.class ); + List params = new ArrayList<>(); params.add( item2.getName() ); q.setParameter( 1, params ); q.setParameter( 2, item2.getDescr() ); - List result = q.getResultList(); + List result = q.getResultList(); assertNotNull( result ); assertEquals( 1, result.size() ); } ); } @Test - public void testParameterList() throws Exception { + public void testParameterList(EntityManagerFactoryScope scope) { final Item item = new Item( "Mouse", "Micro$oft mouse" ); final Item item2 = new Item( "Computer", "Dell computer" ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - em.persist( item2 ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); + scope.inTransaction( entityManager -> { + entityManager.persist( item ); + entityManager.persist( item2 ); + assertTrue( entityManager.contains( item ) ); + } ); - em.getTransaction().begin(); - Query q = em.createQuery( "select item from Item item where item.name in :names" ); + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( "select item from Item item where item.name in :names", Item.class ); //test hint in value and string q.setHint( "org.hibernate.fetchSize", 10 ); q.setHint( "org.hibernate.fetchSize", "10" ); - List params = new ArrayList(); + List params = new ArrayList<>(); params.add( item.getName() ); q.setParameter( "names", params ); - List result = q.getResultList(); + List result = q.getResultList(); assertNotNull( result ); assertEquals( 1, result.size() ); - q = em.createQuery( "select item from Item item where item.name in :names" ); + q = entityManager.createQuery( "select item from Item item where item.name in :names", Item.class ); //test hint in value and string q.setHint( "org.hibernate.fetchSize", 10 ); q.setHint( "org.hibernate.fetchSize", "10" ); @@ -894,8 +703,8 @@ public void testParameterList() throws Exception { assertNotNull( result ); assertEquals( 2, result.size() ); - q = em.createQuery( "select item from Item item where item.name in ?1" ); - params = new ArrayList(); + q = entityManager.createQuery( "select item from Item item where item.name in ?1", Item.class ); + params = new ArrayList<>(); params.add( item.getName() ); params.add( item2.getName() ); // deprecated usage of positional parameter by String @@ -903,52 +712,38 @@ public void testParameterList() throws Exception { result = q.getResultList(); assertNotNull( result ); assertEquals( 2, result.size() ); - em.remove( result.get( 0 ) ); - em.remove( result.get( 1 ) ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testParameterListInExistingParens() throws Exception { + public void testParameterListInExistingParens(EntityManagerFactoryScope scope) { final Item item = new Item( "Mouse", "Micro$oft mouse" ); final Item item2 = new Item( "Computer", "Dell computer" ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - em.persist( item2 ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); + scope.inTransaction( entityManager -> { + entityManager.persist( item ); + entityManager.persist( item2 ); + assertTrue( entityManager.contains( item ) ); + } ); - em.getTransaction().begin(); - Query q = em.createQuery( "select item from Item item where item.name in (:names)" ); + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( "select item from Item item where item.name in (:names)", Item.class ); //test hint in value and string q.setHint( "org.hibernate.fetchSize", 10 ); q.setHint( "org.hibernate.fetchSize", "10" ); - List params = new ArrayList(); + List params = new ArrayList<>(); params.add( item.getName() ); params.add( item2.getName() ); q.setParameter( "names", params ); - List result = q.getResultList(); + List result = q.getResultList(); assertNotNull( result ); assertEquals( 2, result.size() ); - q = em.createQuery( "select item from Item item where item.name in ( \n :names \n)\n" ); + q = entityManager.createQuery( "select item from Item item where item.name in ( \n :names \n)\n", Item.class ); //test hint in value and string q.setHint( "org.hibernate.fetchSize", 10 ); q.setHint( "org.hibernate.fetchSize", "10" ); - params = new ArrayList(); + params = new ArrayList<>(); params.add( item.getName() ); params.add( item2.getName() ); q.setParameter( "names", params ); @@ -956,8 +751,8 @@ public void testParameterListInExistingParens() throws Exception { assertNotNull( result ); assertEquals( 2, result.size() ); - q = em.createQuery( "select item from Item item where item.name in ( ?1 )" ); - params = new ArrayList(); + q = entityManager.createQuery( "select item from Item item where item.name in ( ?1 )", Item.class ); + params = new ArrayList<>(); params.add( item.getName() ); params.add( item2.getName() ); // deprecated usage of positional parameter by String @@ -965,37 +760,23 @@ public void testParameterListInExistingParens() throws Exception { result = q.getResultList(); assertNotNull( result ); assertEquals( 2, result.size() ); - em.remove( result.get( 0 ) ); - em.remove( result.get( 1 ) ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test @Jira( "https://hibernate.atlassian.net/browse/HHH-17490" ) - public void testEmptyParameterList() throws Exception { + public void testEmptyParameterList(EntityManagerFactoryScope scope) { final Item item = new Item( "Mouse", "Micro$oft mouse" ); final Item item2 = new Item( "Computer", "Dell computer" ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - em.persist( item2 ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); + scope.inTransaction( entityManager -> { + entityManager.persist( item ); + entityManager.persist( item2 ); + assertTrue( entityManager.contains( item ) ); + } ); - em.getTransaction().begin(); - TypedQuery q = em.createQuery( + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( "select item from Item item where item.name in :names", Item.class ); @@ -1004,7 +785,7 @@ public void testEmptyParameterList() throws Exception { assertNotNull( result ); assertEquals( 0, result.size() ); - q = em.createQuery( + q = entityManager.createQuery( "select item from Item item where item.name not in :names", Item.class ); @@ -1012,401 +793,263 @@ public void testEmptyParameterList() throws Exception { result = q.getResultList(); assertNotNull( result ); assertEquals( 2, result.size() ); - - em.remove( result.get( 0 ) ); - em.remove( result.get( 1 ) ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testEscapeCharacter() throws Exception { + public void testEscapeCharacter(EntityManagerFactoryScope scope) { final Item item = new Item( "Mouse", "Micro_oft mouse" ); final Item item2 = new Item( "Computer", "Dell computer" ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - em.persist( item2 ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - - em.getTransaction().begin(); - Query q = em.createQuery( "select item from Item item where item.descr like 'Microk_oft mouse' escape 'k' " ); - List result = q.getResultList(); + scope.inTransaction( entityManager -> { + + entityManager.persist( item ); + entityManager.persist( item2 ); + assertTrue( entityManager.contains( item ) ); + } ); + + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( "select item from Item item where item.descr like 'Microk_oft mouse' escape 'k' ", Item.class ); + List result = q.getResultList(); assertNotNull( result ); assertEquals( 1, result.size() ); - int deleted = em.createQuery( "delete from Item" ).executeUpdate(); + int deleted = entityManager.createQuery( "delete from Item" ).executeUpdate(); assertEquals( 2, deleted ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testNativeQueryByEntity() { - Item item = new Item( "Mouse", "Micro$oft mouse" ); + public void testNativeQueryByEntity(EntityManagerFactoryScope scope) { + Statistics stats = scope.getEntityManagerFactory().unwrap( SessionFactory.class ).getStatistics(); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); + scope.inEntityManager( entityManager -> { + + entityManager.getTransaction().begin(); + Item item = new Item( "Mouse", "Micro$oft mouse" ); + entityManager.persist( item ); + assertTrue( entityManager.contains( item ) ); + entityManager.getTransaction().commit(); - Statistics stats = em.getEntityManagerFactory().unwrap( SessionFactoryImplementor.class ).getStatistics(); stats.clear(); assertEquals( 0, stats.getFlushCount() ); - em.getTransaction().begin(); - item = (Item) em.createNativeQuery( "select * from Item", Item.class ).getSingleResult(); + entityManager.getTransaction().begin(); + item = (Item) entityManager.createNativeQuery( "select * from Item", Item.class ).getSingleResult(); assertEquals( 1, stats.getFlushCount() ); assertNotNull( item ); assertEquals( "Micro$oft mouse", item.getDescr() ); - em.remove( item ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + entityManager.getTransaction().commit(); + } ); } @Test - public void testNativeQueryByResultSet() { - Item item = new Item( "Mouse", "Micro$oft mouse" ); - - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - - em.getTransaction().begin(); - item = (Item) em.createNativeQuery( + public void testNativeQueryByResultSet(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + Item item = new Item( "Mouse", "Micro$oft mouse" ); + entityManager.persist( item ); + assertTrue( entityManager.contains( item ) ); + } ); + + scope.inTransaction( entityManager -> { + Item item = (Item) entityManager.createNativeQuery( "select name as itemname, descr as itemdescription from Item", "getItem" - ) - .getSingleResult(); + ).getSingleResult(); assertNotNull( item ); assertEquals( "Micro$oft mouse", item.getDescr() ); - em.remove( item ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testExplicitPositionalParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testExplicitPositionalParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Wallet w = new Wallet(); w.setBrand( "Lacoste" ); w.setModel( "Minimic" ); w.setSerial( "0100202002" ); - em.persist( w ); - em.getTransaction().commit(); - em.getTransaction().begin(); - Query query = em.createQuery( "select w from " + Wallet.class.getName() + " w where w.brand in ?1" ); - List brands = new ArrayList(); + entityManager.persist( w ); + } ); + + scope.inTransaction( entityManager -> { + TypedQuery query = entityManager.createQuery( "select w from " + Wallet.class.getName() + " w where w.brand in ?1", Wallet.class ); + List brands = new ArrayList<>(); brands.add( "Lacoste" ); query.setParameter( 1, brands ); - w = (Wallet) query.getSingleResult(); + Wallet w = query.getSingleResult(); assertNotNull( w ); - query = em.createQuery( "select w from " + Wallet.class.getName() + " w where w.marketEntrance = ?1" ); + query = entityManager.createQuery( "select w from " + Wallet.class.getName() + " w where w.marketEntrance = ?1", Wallet.class ); query.setParameter( 1, new Date(), TemporalType.DATE ); - //assertNull( query.getSingleResult() ); assertEquals( 0, query.getResultList().size() ); - em.remove( w ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testTemporalTypeBinding() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - Query query = em.createQuery( "select w from " + Wallet.class.getName() + " w where w.marketEntrance = :me" ); - Parameter parameter = query.getParameter( "me", Date.class ); - assertEquals( parameter.getParameterType(), java.sql.Timestamp.class ); + public void testTemporalTypeBinding(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + + TypedQuery query = entityManager.createQuery( "select w from " + Wallet.class.getName() + " w where w.marketEntrance = :me", Wallet.class ); + Parameter parameter = query.getParameter( "me", Date.class ); + assertEquals( java.sql.Timestamp.class, parameter.getParameterType() ); query.setParameter( "me", new Date() ); query.setParameter( "me", new Date(), TemporalType.DATE ); query.setParameter( "me", new GregorianCalendar(), TemporalType.DATE ); - - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } - + } ); } @Test - public void testPositionalParameterForms() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testPositionalParameterForms(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Wallet w = new Wallet(); w.setBrand( "Lacoste" ); w.setModel( "Minimic" ); w.setSerial( "0100202002" ); - em.persist( w ); - em.getTransaction().commit(); + entityManager.persist( w ); + } ); - em.getTransaction().begin(); + scope.inTransaction( entityManager -> { // first using jpa-style positional parameter - Query query = em.createQuery( "select w from Wallet w where w.brand = ?1" ); + TypedQuery query = entityManager.createQuery( "select w from Wallet w where w.brand = ?1", Wallet.class ); query.setParameter( 1, "Lacoste" ); - w = (Wallet) query.getSingleResult(); + Wallet w = query.getSingleResult(); assertNotNull( w ); // next using jpa-style positional parameter, but as a name (which is how Hibernate core treats these - query = em.createQuery( "select w from Wallet w where w.brand = ?1" ); + query = entityManager.createQuery( "select w from Wallet w where w.brand = ?1", Wallet.class ); // deprecated usage of positional parameter by String query.setParameter( 1, "Lacoste" ); - w = (Wallet) query.getSingleResult(); + w = query.getSingleResult(); assertNotNull( w ); - - em.remove( w ); - em.getTransaction().commit(); - } - catch (Exception e){ - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testPositionalParameterWithUserError() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testPositionalParameterWithUserError(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Wallet w = new Wallet(); w.setBrand( "Lacoste" ); w.setModel( "Minimic" ); w.setSerial( "0100202002" ); - em.persist( w ); - em.flush(); + entityManager.persist( w ); + entityManager.flush(); // Gaps are not allowed - try { - Query jpaQuery = em.createQuery( "select w from Wallet w where w.brand = ?1 and w.model = ?3" ); - fail( "expecting error regarding gap in positional param labels" ); - } - catch ( IllegalArgumentException e ) { - assertNotNull( e.getCause() ); - assertTyping( QueryException.class, e.getCause() ); - assertTrue( e.getCause().getMessage().contains( "Gap" ) ); - } + IllegalArgumentException iae = assertThrows( + IllegalArgumentException.class, + () -> entityManager.createQuery( "select w from Wallet w where w.brand = ?1 and w.model = ?3", Wallet.class ), + "expecting error regarding gap in positional param labels" + ); + assertNotNull( iae.getCause() ); + assertTyping( QueryException.class, iae.getCause() ); + assertTrue( iae.getCause().getMessage().contains( "Gap" ) ); // using jpa-style, position index should match syntax '?'. - Query jpaQuery = em.createQuery( "select w from Wallet w where w.brand = ?1" ); - jpaQuery.setParameter( 1, "Lacoste" ); - try { - jpaQuery.setParameter( 2, "Expensive" ); - fail( "Should fail due to a user error in parameters" ); - } - catch (Exception e) { - assertTyping( IllegalArgumentException.class, e ); - } + assertThrows( + IllegalArgumentException.class, + () -> { + Query jpaQuery = entityManager.createQuery( "select w from Wallet w where w.brand = ?1", Wallet.class ); + jpaQuery.setParameter( 1, "Lacoste" ); + jpaQuery.setParameter( 2, "Expensive" ); + }, + "Should fail due to a user error in parameters" + ); // using jpa-style, position index specified not in query - test exception type - jpaQuery = em.createQuery( "select w from Wallet w " ); - try { - Parameter parameter = jpaQuery.getParameter( 1 ); - fail( "Should fail due to a user error in parameters" ); - } - catch (Exception e) { - assertTyping( IllegalArgumentException.class, e ); - } + assertThrows( + IllegalArgumentException.class, + () -> { + Query jpaQuery = entityManager.createQuery( "select w from Wallet w " ); + jpaQuery.getParameter( 1 ); + }, + "Should fail due to a user error in parameters" + ); // using jpa-style, position index specified not in query - test exception type - jpaQuery = em.createQuery( "select w from Wallet w" ); - try { - Parameter parameter = jpaQuery.getParameter( 1, Integer.class ); - fail( "Should fail due to user error in parameters" ); - } - catch (Exception e) { - assertTyping( IllegalArgumentException.class, e ); - } - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + assertThrows( + IllegalArgumentException.class, + () -> { + Query jpaQuery = entityManager.createQuery( "select w from Wallet w" ); + jpaQuery.getParameter( 1, Integer.class ); + }, + "Should fail due to a user error in parameters" + ); + } ); } @Test @JiraKey(value = "HHH-10803") - public void testNamedParameterWithUserError() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testNamedParameterWithUserError(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Wallet w = new Wallet(); w.setBrand( "Lacoste" ); w.setModel( "Minimic" ); w.setSerial( "0100202002" ); - em.persist( w ); - em.flush(); - - Query jpaQuery = em.createQuery( "select w from Wallet w" ); - try { - Parameter parameter = jpaQuery.getParameter( "brand" ); - fail( "Should fail due to user error in parameters" ); - } - catch (Exception e) { - assertTyping( IllegalArgumentException.class, e ); - } - - jpaQuery = em.createQuery( "select w from Wallet w" ); - try { - Parameter parameter = jpaQuery.getParameter( "brand", String.class ); - fail( "Should fail due to user error in parameters" ); - } - catch (Exception e) { - assertTyping( IllegalArgumentException.class, e ); - } - - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + entityManager.persist( w ); + entityManager.flush(); + + assertThrows( + IllegalArgumentException.class, + () -> { + Query jpaQuery = entityManager.createQuery( "select w from Wallet w", Wallet.class ); + jpaQuery.getParameter( "brand" ); + }, + "Should fail due to a user error in parameters" + ); + + assertThrows( + IllegalArgumentException.class, + () -> { + Query jpaQuery = entityManager.createQuery( "select w from Wallet w", Wallet.class ); + jpaQuery.getParameter( "brand", String.class ); + }, + "Should fail due to a user error in parameters" + ); + } ); } @Test - public void testNativeQuestionMarkParameter() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testNativeQuestionMarkParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Wallet w = new Wallet(); w.setBrand( "Lacoste" ); w.setModel( "Minimic" ); w.setSerial( "0100202002" ); - em.persist( w ); - em.getTransaction().commit(); - em.getTransaction().begin(); - Query query = em.createNativeQuery( "select * from Wallet w where w.brand = ?", Wallet.class ); + entityManager.persist( w ); + } ); + + scope.inTransaction( entityManager -> { + Query query = entityManager.createNativeQuery( "select * from Wallet w where w.brand = ?", Wallet.class ); query.setParameter( 1, "Lacoste" ); - w = (Wallet) query.getSingleResult(); + Wallet w = (Wallet) query.getSingleResult(); assertNotNull( w ); - em.remove( w ); - em.getTransaction().commit(); - } - catch (Exception e) { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - - em.close(); - } + } ); } @Test - public void testNativeQueryWithPositionalParameter() { - Item item = new Item( "Mouse", "Micro$oft mouse" ); - - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - - em.getTransaction().begin(); - Query query = em.createNativeQuery( "select * from Item where name = ?1", Item.class ); + public void testNativeQueryWithPositionalParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + Item item = new Item( "Mouse", "Micro$oft mouse" ); + entityManager.persist( item ); + assertTrue( entityManager.contains( item ) ); + } ); + + scope.inTransaction( entityManager -> { + Query query = entityManager.createNativeQuery( "select * from Item where name = ?1", Item.class ); query.setParameter( 1, "Mouse" ); - item = (Item) query.getSingleResult(); + Item item = (Item) query.getSingleResult(); assertNotNull( item ); assertEquals( "Micro$oft mouse", item.getDescr() ); - query = em.createNativeQuery( "select * from Item where name = ?", Item.class ); + query = entityManager.createNativeQuery( "select * from Item where name = ?", Item.class ); query.setParameter( 1, "Mouse" ); item = (Item) query.getSingleResult(); assertNotNull( item ); assertEquals( "Micro$oft mouse", item.getDescr() ); - em.remove( item ); - em.getTransaction().commit(); - } - catch (Exception e) { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testDistinct() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.createQuery( "delete Item" ).executeUpdate(); - em.createQuery( "delete Distributor" ).executeUpdate(); + public void testDistinct(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Distributor d1 = new Distributor(); d1.setName( "Fnac" ); Distributor d2 = new Distributor(); @@ -1414,32 +1057,22 @@ public void testDistinct() throws Exception { Item item = new Item( "Mouse", "Micro$oft mouse" ); item.getDistributors().add( d1 ); item.getDistributors().add( d2 ); - em.persist( d1 ); - em.persist( d2 ); - em.persist( item ); - em.flush(); - em.clear(); - Query q = em.createQuery( "select distinct i from Item i left join fetch i.distributors" ); - item = (Item) q.getSingleResult() - ; - //assertEquals( 1, distinctResult.size() ); - //item = (Item) distinctResult.get( 0 ); + entityManager.persist( d1 ); + entityManager.persist( d2 ); + entityManager.persist( item ); + entityManager.flush(); + entityManager.clear(); + + TypedQuery q = entityManager.createQuery( "select distinct i from Item i left join fetch i.distributors", Item.class ); + item = q.getSingleResult(); assertTrue( Hibernate.isInitialized( item.getDistributors() ) ); assertEquals( 2, item.getDistributors().size() ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testIsNull() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testIsNull(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Distributor d1 = new Distributor(); d1.setName( "Fnac" ); Distributor d2 = new Distributor(); @@ -1448,222 +1081,153 @@ public void testIsNull() throws Exception { Item item2 = new Item( "Mouse2", "dd" ); item.getDistributors().add( d1 ); item.getDistributors().add( d2 ); - em.persist( d1 ); - em.persist( d2 ); - em.persist( item ); - em.persist( item2 ); - em.flush(); - em.clear(); - Query q = em.createQuery( - "select i from Item i where i.descr = :descr or (i.descr is null and cast(:descr as string) is null)" + entityManager.persist( d1 ); + entityManager.persist( d2 ); + entityManager.persist( item ); + entityManager.persist( item2 ); + entityManager.flush(); + entityManager.clear(); + + TypedQuery q = entityManager.createQuery( + "select i from Item i where i.descr = :descr or (i.descr is null and cast(:descr as string) is null)", Item.class ); - //Query q = em.createQuery( "select i from Item i where (i.descr is null and :descr is null) or (i.descr = :descr"); q.setParameter( "descr", "dd" ); - List result = q.getResultList(); + List result = q.getResultList(); assertEquals( 1, result.size() ); q.setParameter( "descr", null ); result = q.getResultList(); assertEquals( 1, result.size() ); - //item = (Item) distinctResult.get( 0 ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testUpdateQuery() { - Item item = new Item( "Mouse", "Micro$oft mouse" ); - - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - assertTrue( em.contains( item ) ); - - em.flush(); - em.clear(); + public void testUpdateQuery(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + Item item = new Item( "Mouse", "Micro$oft mouse" ); + entityManager.persist( item ); + assertTrue( entityManager.contains( item ) ); + entityManager.flush(); + entityManager.clear(); assertEquals( - 1, em.createNativeQuery( - "update Item set descr = 'Logitech Mouse' where name = 'Mouse'" + 1, entityManager.createNativeQuery( + "update Item set descr = 'Logitech Mouse' where name = 'Mouse'", Item.class ).executeUpdate() ); - item = em.find( Item.class, item.getName() ); + item = entityManager.find( Item.class, item.getName() ); assertEquals( "Logitech Mouse", item.getDescr() ); - em.remove( item ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testUnavailableNamedQuery() throws Exception { - Item item = new Item( "Mouse", "Micro$oft mouse" ); - - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - try { - em.createNamedQuery( "wrong name" ); - fail( "Wrong named query should raise an exception" ); - } - catch (IllegalArgumentException e) { - //success - } + public void testUnavailableNamedQuery(EntityManagerFactoryScope scope) { + final Item item = new Item( "Mouse", "Micro$oft mouse" ); + scope.inTransaction( entityManager -> { + entityManager.persist( item ); + + assertThrows( + IllegalArgumentException.class, + () -> entityManager.createNamedQuery( "wrong name" ), + "Wrong named query should raise an exception" + ); + assertTrue( - "thrown IllegalArgumentException should of caused transaction to be marked for rollback only", - true == em.getTransaction().getRollbackOnly() + entityManager.getTransaction().getRollbackOnly(), + "thrown IllegalArgumentException should have caused transaction to be marked for rollback only" ); - em.getTransaction().rollback(); // HHH-8442 changed to rollback since thrown ISE causes - // transaction to be marked for rollback only. - // No need to remove entity since it was rolled back. + } ); - assertNull( - "entity should not of been saved to database since IllegalArgumentException should of" + - "caused transaction to be marked for rollback only", em.find( Item.class, item.getName() ) + scope.inTransaction( entityManager -> { + assertNull( entityManager.find( Item.class, item.getName() ), + "entity should not have been saved to database since IllegalArgumentException should have " + + "caused transaction to be marked for rollback only" ); - } - finally { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - em.close(); - } + } ); } @Test - public void testTypedNamedNativeQuery() { - Item item = new Item( "Mouse", "Micro$oft mouse" ); - - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( item ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); - - em.getTransaction().begin(); - item = em.createNamedQuery( "nativeItem1", Item.class ).getSingleResult(); - item = em.createNamedQuery( "nativeItem2", Item.class ).getSingleResult(); + public void testTypedNamedNativeQuery(EntityManagerFactoryScope scope) { + + scope.inTransaction( entityManager -> { + Item item = new Item( "Mouse", "Micro$oft mouse" ); + entityManager.persist( item ); + assertTrue( entityManager.contains( item ) ); + } ); + + scope.inTransaction( entityManager -> { + Item item = entityManager.createNamedQuery( "nativeItem1", Item.class ).getSingleResult(); + item = entityManager.createNamedQuery( "nativeItem2", Item.class ).getSingleResult(); assertNotNull( item ); assertEquals( "Micro$oft mouse", item.getDescr() ); - em.remove( item ); - em.getTransaction().commit(); - - } - catch (Exception e) { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testTypedScalarQueries() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { + public void testTypedScalarQueries(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Item item = new Item( "Mouse", "Micro$oft mouse" ); - em.persist( item ); - assertTrue( em.contains( item ) ); - em.getTransaction().commit(); + entityManager.persist( item ); + assertTrue( entityManager.contains( item ) ); + } ); - em.getTransaction().begin(); - Object[] itemData = em.createQuery( "select i.name,i.descr from Item i", Object[].class ).getSingleResult(); + scope.inTransaction( entityManager -> { + Object[] itemData = entityManager.createQuery( "select i.name,i.descr from Item i", Object[].class ).getSingleResult(); assertEquals( 2, itemData.length ); assertEquals( String.class, itemData[0].getClass() ); assertEquals( String.class, itemData[1].getClass() ); - Tuple itemTuple = em.createQuery( "select i.name,i.descr from Item i", Tuple.class ).getSingleResult(); + Tuple itemTuple = entityManager.createQuery( "select i.name,i.descr from Item i", Tuple.class ).getSingleResult(); assertEquals( 2, itemTuple.getElements().size() ); assertEquals( String.class, itemTuple.get( 0 ).getClass() ); assertEquals( String.class, itemTuple.get( 1 ).getClass() ); - Item itemView = em.createQuery( "select new Item(i.name,i.descr) from Item i", Item.class ) + Item itemView = entityManager.createQuery( "select new Item(i.name,i.descr) from Item i", Item.class ) .getSingleResult(); assertNotNull( itemView ); assertEquals( "Micro$oft mouse", itemView.getDescr() ); - itemView = em.createNamedQuery( "query-construct", Item.class ).getSingleResult(); + itemView = entityManager.createNamedQuery( "query-construct", Item.class ).getSingleResult(); assertNotNull( itemView ); assertEquals( "Micro$oft mouse", itemView.getDescr() ); - em.remove( item ); - em.getTransaction().commit(); - } - catch (Exception e) { - if ( em.getTransaction() != null && em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test @JiraKey(value = "HHH-10269") - public void testFailingNativeQuery() { - final EntityManager entityManager = getOrCreateEntityManager(); - try { - // Tests that Oracle does not run out of cursors. - for ( int i = 0; i < 1000; i++ ) { - try { - entityManager.createNativeQuery( "Select 1 from NotExistedTable" ).getResultList(); - fail( "expected PersistenceException" ); - } - catch (PersistenceException e) { - // expected - } - } - }finally { - entityManager.close(); - } - + public void testFailingNativeQuery(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + PersistenceException.class, + () -> { + // Tests that Oracle does not run out of cursors. + for ( int i = 0; i < 1000; i++ ) { + entityManager.createNativeQuery( "Select 1 from NonExistentTable" ).getResultList(); + } + }, + "Expected PersistenceException" + ); + } ); } @Test @JiraKey(value = "HHH-10833") - public void testGetSingleResultWithNoResultException() { - final EntityManager entityManager = getOrCreateEntityManager(); - try { - entityManager.createQuery( "FROM Item WHERE name = 'bozo'" ).getSingleResult(); - fail( "Expected NoResultException" ); - } - catch ( Exception e ) { - assertTyping( NoResultException.class, e ); - } - finally { - entityManager.close(); - } + public void testGetSingleResultWithNoResultException(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + NoResultException.class, + () -> entityManager.createQuery( "FROM Item WHERE name = 'bozo'" ).getSingleResult(), + "Expected NoResultException" + ); + } ); } @Test - public void testGetSingleResultWithManyResultsException() { - final EntityManager entityManager = getOrCreateEntityManager(); - try { - entityManager.getTransaction().begin(); + public void testGetSingleResultWithManyResultsException(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { entityManager.persist( new Item( "1", "1" ) ); entityManager.persist( new Item( "2", "2" ) ); - entityManager.createQuery( "FROM Item" ).getSingleResult(); - fail( "Expected NoResultException" ); - } - catch ( Exception e ) { - assertTyping( NonUniqueResultException.class, e ); - } - finally { - entityManager.getTransaction().rollback(); - entityManager.close(); - } + assertThrows( + NonUniqueResultException.class, + () -> entityManager.createQuery( "FROM Item" ).getSingleResult(), + "Expected NonUniqueResultException" + ); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryWithLiteralsInSelectExpressionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryWithLiteralsInSelectExpressionTest.java index a058580f1c36..3d91307333a2 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryWithLiteralsInSelectExpressionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/QueryWithLiteralsInSelectExpressionTest.java @@ -6,108 +6,84 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; -import jakarta.persistence.EntityManager; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.Table; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import java.io.Serializable; import java.util.List; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import org.hibernate.testing.orm.junit.JiraKey; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; /** * @author Andrea Boriero */ -public class QueryWithLiteralsInSelectExpressionTest extends BaseEntityManagerFunctionalTestCase { +@Jpa(annotatedClasses = {QueryWithLiteralsInSelectExpressionTest.MyEntity.class}) +public class QueryWithLiteralsInSelectExpressionTest { - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] {MyEntity.class}; + @BeforeEach + public void init(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> entityManager.persist( new MyEntity( "Fab", "A" ) ) ); } - @Before - public void init() { - final EntityManager entityManager = getOrCreateEntityManager(); - try { - entityManager.getTransaction().begin(); - entityManager.persist( new MyEntity( "Fab", "A" ) ); - entityManager.getTransaction().commit(); - } - catch (Exception e) { - if ( entityManager.getTransaction().isActive() ) { - entityManager.getTransaction().rollback(); - } - throw e; - } - finally { - entityManager.close(); - } + @AfterEach + public void cleanup(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test @JiraKey(value = "HHH-10230") - public void testSelectLiterals() { - final EntityManager entityManager = getOrCreateEntityManager(); - try { + public void testSelectLiterals(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { final List elements = entityManager.createQuery( "SELECT true, false, e.name FROM MyEntity e", Object[].class ).getResultList(); - Assert.assertEquals( 1, elements.size() ); - Assert.assertEquals( 3, elements.get( 0 ).length ); - Assert.assertEquals( true, elements.get( 0 )[0] ); - Assert.assertEquals( false, elements.get( 0 )[1] ); - Assert.assertEquals( "Fab", elements.get( 0 )[2] ); - } - finally { - entityManager.close(); - } + assertEquals( 1, elements.size() ); + assertEquals( 3, elements.get( 0 ).length ); + assertEquals( true, elements.get( 0 )[0] ); + assertEquals( false, elements.get( 0 )[1] ); + assertEquals( "Fab", elements.get( 0 )[2] ); + } ); } @Test @JiraKey(value = "HHH-10230") - public void testSelectNonNullLiteralsCastToBoolean() { - final EntityManager entityManager = getOrCreateEntityManager(); - try { + public void testSelectNonNullLiteralsCastToBoolean(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { final List elements = entityManager.createQuery( "SELECT cast( true as boolean ), cast( false as boolean ), e.name FROM MyEntity e", Object[].class ).getResultList(); - Assert.assertEquals( 1, elements.size() ); - Assert.assertEquals( 3, elements.get( 0 ).length ); - Assert.assertEquals( true, elements.get( 0 )[ 0 ] ); - Assert.assertEquals( false, elements.get( 0 )[ 1 ] ); - Assert.assertEquals( "Fab", elements.get( 0 )[ 2 ] ); - } - finally { - entityManager.close(); - } + assertEquals( 1, elements.size() ); + assertEquals( 3, elements.get( 0 ).length ); + assertEquals( true, elements.get( 0 )[ 0 ] ); + assertEquals( false, elements.get( 0 )[ 1 ] ); + assertEquals( "Fab", elements.get( 0 )[ 2 ] ); + } ); } @Test @JiraKey(value = "HHH-10230") - public void testSelectNullLiterals() { - final EntityManager entityManager = getOrCreateEntityManager(); - try { + public void testSelectNullLiterals(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { final List elements = entityManager.createQuery( "SELECT cast(null as boolean), false, e.name FROM MyEntity e", Object[].class ).getResultList(); - Assert.assertEquals( 1, elements.size() ); - Assert.assertEquals( 3, elements.get( 0 ).length ); - Assert.assertEquals( null, elements.get( 0 )[ 0 ] ); - Assert.assertEquals( false, elements.get( 0 )[ 1 ] ); - Assert.assertEquals( "Fab", elements.get( 0 )[ 2 ] ); - } - finally { - entityManager.close(); - } + assertEquals( 1, elements.size() ); + assertEquals( 3, elements.get( 0 ).length ); + assertNull( elements.get( 0 )[0] ); + assertEquals( false, elements.get( 0 )[ 1 ] ); + assertEquals( "Fab", elements.get( 0 )[ 2 ] ); + } ); } @Entity(name = "MyEntity") diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/RegisterNamedQueryWithParameterTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/RegisterNamedQueryWithParameterTest.java index 9786977a0d4a..7279d8b2999f 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/RegisterNamedQueryWithParameterTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/RegisterNamedQueryWithParameterTest.java @@ -57,7 +57,7 @@ public void testExecuteNativeQuery(EntityManagerFactoryScope scope) { entityManager -> { Query query = entityManager.createNamedQuery( QUERY_NAME ); query.setParameter( "value", 1 ); - List results = query.getResultList(); + List results = query.getResultList(); assertThat( results.size() ).isEqualTo( 1 ); } ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ReuseCriteriaWithMixedParametersTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ReuseCriteriaWithMixedParametersTest.java index 84039ec91afc..39dbdffc29ba 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ReuseCriteriaWithMixedParametersTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ReuseCriteriaWithMixedParametersTest.java @@ -27,7 +27,7 @@ import jakarta.persistence.criteria.ParameterExpression; import jakarta.persistence.criteria.Root; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; @Jpa( diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ScalarResultNativeQueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ScalarResultNativeQueryTest.java index 729fad33aca5..50e727add6b2 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ScalarResultNativeQueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/ScalarResultNativeQueryTest.java @@ -4,23 +4,23 @@ */ package org.hibernate.orm.test.jpa.query; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; import jakarta.persistence.Column; import jakarta.persistence.ColumnResult; import jakarta.persistence.Entity; -import jakarta.persistence.EntityManager; import jakarta.persistence.Id; import jakarta.persistence.NamedNativeQuery; import jakarta.persistence.SqlResultSetMapping; import jakarta.persistence.Table; import org.hibernate.dialect.H2Dialect; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; -import org.hibernate.testing.RequiresDialect; -import org.junit.Test; +import org.hibernate.testing.orm.junit.RequiresDialect; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.Test; /** * Tests for selecting scalar value from native queries. @@ -28,7 +28,8 @@ * @author Gunnar Morling */ @RequiresDialect(H2Dialect.class) -public class ScalarResultNativeQueryTest extends BaseEntityManagerFunctionalTestCase { +@Jpa(annotatedClasses = {ScalarResultNativeQueryTest.Person.class}) +public class ScalarResultNativeQueryTest { @Entity(name="Person") @Table(name="person") @@ -52,31 +53,16 @@ public Person(Integer id, int age) { } } - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { Person.class }; - } - @Test - public void shouldApplyConfiguredTypeForProjectionOfScalarValue() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( new Person( 1, 29 ) ); - em.getTransaction().commit(); - em.close(); + public void shouldApplyConfiguredTypeForProjectionOfScalarValue(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> entityManager.persist( new Person( 1, 29 ) ) ); - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - List results = em.createNamedQuery( "personAge", String.class ).getResultList(); - assertEquals( 1, results.size() ); - assertEquals( "29", results.get( 0 ) ); - em.getTransaction().commit(); - em.close(); + scope.inTransaction( entityManager -> { + List results = entityManager.createNamedQuery( "personAge", String.class ).getResultList(); + assertEquals( 1, results.size() ); + assertEquals( "29", results.get( 0 ) ); + } ); - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete from Person" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + scope.inTransaction( entityManager -> entityManager.createQuery( "delete from Person" ).executeUpdate() ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/TupleNativeQueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/TupleNativeQueryTest.java index c646ae6dbd66..1ff95023baa9 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/TupleNativeQueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/TupleNativeQueryTest.java @@ -5,44 +5,42 @@ package org.hibernate.orm.test.jpa.query; import org.hibernate.dialect.H2Dialect; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; import org.hibernate.query.NativeQuery; import org.hibernate.query.sql.internal.NativeQueryImpl; -import org.hibernate.testing.RequiresDialect; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.RequiresDialect; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import jakarta.persistence.*; import jakarta.persistence.criteria.CriteriaDelete; import java.util.List; import java.util.stream.Collectors; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; @RequiresDialect(H2Dialect.class) -public class TupleNativeQueryTest extends BaseEntityManagerFunctionalTestCase { - @Override - protected Class[] getAnnotatedClasses() { - return new Class[]{User.class}; - } +@Jpa(annotatedClasses = {TupleNativeQueryTest.User.class}) +public class TupleNativeQueryTest { - @Before - public void setUp() { - doInJPA(this::entityManagerFactory, entityManager -> { + @BeforeEach + public void setUp(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { User user = new User("Arnold"); entityManager.persist(user); }); } - @After - public void tearDown() { - doInJPA(this::entityManagerFactory, entityManager -> { + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaDelete delete = entityManager.getCriteriaBuilder().createCriteriaDelete(User.class); delete.from(User.class); entityManager.createQuery(delete).executeUpdate(); @@ -50,8 +48,8 @@ public void tearDown() { } @Test - public void testPositionalGetterShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testPositionalGetterShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleResult(entityManager); Tuple tuple = result.get(0); assertEquals(1L, tuple.get(0)); @@ -60,8 +58,8 @@ public void testPositionalGetterShouldWorkProperly() { } @Test - public void testPositionalGetterWithClassShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testPositionalGetterWithClassShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleResult(entityManager); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get(0, Long.class)); @@ -69,70 +67,51 @@ public void testPositionalGetterWithClassShouldWorkProperly() { }); } - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterShouldThrowExceptionWhenLessThanZeroGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(-1); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithClassShouldThrowExceptionWhenLessThanZeroGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(-1); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterShouldThrowExceptionWhenTupleSizePositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(2); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithClassShouldThrowExceptionWhenTupleSizePositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(2); + @Test + public void testPositionalGetterShouldThrowExceptionWhenLessThanZeroGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getTupleResult(entityManager); + Tuple tuple = result.get(0); + tuple.get(-1); + } + ); }); } - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterShouldThrowExceptionWhenExceedingPositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(3); + @Test + public void testPositionalGetterShouldThrowExceptionWhenTupleSizePositionGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getTupleResult(entityManager); + Tuple tuple = result.get(0); + tuple.get(2); + } + ); }); } - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithClassShouldThrowExceptionWhenExceedingPositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(3); + @Test + public void testPositionalGetterShouldThrowExceptionWhenExceedingPositionGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getTupleResult(entityManager); + Tuple tuple = result.get(0); + tuple.get(3); + } + ); }); } - @Test - public void testAliasGetterWithoutExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithoutExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleResult(entityManager); Tuple tuple = result.get(0); assertEquals(1L, tuple.get("ID")); @@ -141,26 +120,31 @@ public void testAliasGetterWithoutExplicitAliasShouldWorkProperly() { } @Test - public void testAliasGetterShouldWorkWithoutExplicitAliasWhenLowerCaseAliasGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterShouldWorkWithoutExplicitAliasWhenLowerCaseAliasGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleResult(entityManager); Tuple tuple = result.get(0); tuple.get("id"); }); } - @Test(expected = IllegalArgumentException.class) - public void testAliasGetterShouldThrowExceptionWithoutExplicitAliasWhenWrongAliasGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get("e"); + @Test + public void testAliasGetterShouldThrowExceptionWithoutExplicitAliasWhenWrongAliasGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getTupleResult(entityManager); + Tuple tuple = result.get(0); + tuple.get("e"); + } + ); }); } @Test - public void testAliasGetterWithClassWithoutExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithClassWithoutExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleResult(entityManager); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get("ID", Long.class)); @@ -168,10 +152,9 @@ public void testAliasGetterWithClassWithoutExplicitAliasShouldWorkProperly() { }); } - @Test - public void testAliasGetterWithExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleAliasedResult(entityManager); Tuple tuple = result.get(0); assertEquals(1L, tuple.get("ALIAS1")); @@ -180,8 +163,8 @@ public void testAliasGetterWithExplicitAliasShouldWorkProperly() { } @Test - public void testAliasGetterWithClassWithExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithClassWithExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleAliasedResult(entityManager); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get("ALIAS1", Long.class)); @@ -190,8 +173,8 @@ public void testAliasGetterWithClassWithExplicitAliasShouldWorkProperly() { } @Test - public void testToArrayShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testToArrayShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List tuples = getTupleResult(entityManager); Object[] result = tuples.get(0).toArray(); assertArrayEquals(new Object[]{1L, "Arnold"}, result); @@ -199,8 +182,8 @@ public void testToArrayShouldWorkProperly() { } @Test - public void testGetElementsShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testGetElementsShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List tuples = getTupleResult(entityManager); List> result = tuples.get(0).getElements(); assertEquals(2, result.size()); @@ -212,8 +195,8 @@ public void testGetElementsShouldWorkProperly() { } @Test - public void testPositionalGetterWithNamedNativeQueryShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testPositionalGetterWithNamedNativeQueryShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleNamedResult(entityManager, "standard"); Tuple tuple = result.get(0); assertEquals(1L, tuple.get(0)); @@ -222,8 +205,8 @@ public void testPositionalGetterWithNamedNativeQueryShouldWorkProperly() { } @Test - public void testPositionalGetterWithNamedNativeQueryWithClassShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testPositionalGetterWithNamedNativeQueryWithClassShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleNamedResult(entityManager, "standard"); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get(0, Long.class)); @@ -231,70 +214,51 @@ public void testPositionalGetterWithNamedNativeQueryWithClassShouldWorkProperly( }); } - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenLessThanZeroGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleNamedResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(-1); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithNamedNativeQueryWithClassShouldThrowExceptionWhenLessThanZeroGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleNamedResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(-1); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenTupleSizePositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleNamedResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(2); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithNamedNativeQueryWithClassShouldThrowExceptionWhenTupleSizePositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleNamedResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(2); + @Test + public void testPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenLessThanZeroGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getTupleNamedResult(entityManager, "standard"); + Tuple tuple = result.get(0); + tuple.get(-1); + } + ); }); } - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenExceedingPositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleNamedResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(3); + @Test + public void testPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenTupleSizePositionGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getTupleNamedResult(entityManager, "standard"); + Tuple tuple = result.get(0); + tuple.get(2); + } + ); }); } - - @Test(expected = IllegalArgumentException.class) - public void testPositionalGetterWithNamedNativeQueryWithClassShouldThrowExceptionWhenExceedingPositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleNamedResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(3); + @Test + public void testPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenExceedingPositionGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getTupleNamedResult(entityManager, "standard"); + Tuple tuple = result.get(0); + tuple.get(3); + } + ); }); } - @Test - public void testAliasGetterWithNamedNativeQueryWithoutExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithNamedNativeQueryWithoutExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleNamedResult(entityManager, "standard"); Tuple tuple = result.get(0); assertEquals(1L, tuple.get("ID")); @@ -303,26 +267,31 @@ public void testAliasGetterWithNamedNativeQueryWithoutExplicitAliasShouldWorkPro } @Test - public void testAliasGetterWithNamedNativeQueryShouldWorkWithoutExplicitAliasWhenLowerCaseAliasGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithNamedNativeQueryShouldWorkWithoutExplicitAliasWhenLowerCaseAliasGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleNamedResult(entityManager, "standard"); Tuple tuple = result.get(0); tuple.get("id"); }); } - @Test(expected = IllegalArgumentException.class) - public void testAliasGetterWithNamedNativeQueryShouldThrowExceptionWithoutExplicitAliasWhenWrongAliasGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getTupleNamedResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get("e"); + @Test + public void testAliasGetterWithNamedNativeQueryShouldThrowExceptionWithoutExplicitAliasWhenWrongAliasGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getTupleNamedResult(entityManager, "standard"); + Tuple tuple = result.get(0); + tuple.get("e"); + } + ); }); } @Test - public void testAliasGetterWithNamedNativeQueryWithClassWithoutExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithNamedNativeQueryWithClassWithoutExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleNamedResult(entityManager, "standard"); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get("ID", Long.class)); @@ -330,10 +299,9 @@ public void testAliasGetterWithNamedNativeQueryWithClassWithoutExplicitAliasShou }); } - @Test - public void testAliasGetterWithNamedNativeQueryWithExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithNamedNativeQueryWithExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleNamedResult(entityManager, "standard_with_alias"); Tuple tuple = result.get(0); assertEquals(1L, tuple.get("ALIAS1")); @@ -342,8 +310,8 @@ public void testAliasGetterWithNamedNativeQueryWithExplicitAliasShouldWorkProper } @Test - public void testAliasGetterWithNamedNativeQueryWithClassWithExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testAliasGetterWithNamedNativeQueryWithClassWithExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleNamedResult(entityManager, "standard_with_alias"); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get("ALIAS1", Long.class)); @@ -352,8 +320,8 @@ public void testAliasGetterWithNamedNativeQueryWithClassWithExplicitAliasShouldW } @Test - public void testToArrayShouldWithNamedNativeQueryWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testToArrayShouldWithNamedNativeQueryWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List tuples = getTupleNamedResult(entityManager, "standard"); Object[] result = tuples.get(0).toArray(); assertArrayEquals(new Object[]{1L, "Arnold"}, result); @@ -361,8 +329,8 @@ public void testToArrayShouldWithNamedNativeQueryWorkProperly() { } @Test - public void testGetElementsWithNamedNativeQueryShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testGetElementsWithNamedNativeQueryShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List tuples = getTupleNamedResult(entityManager, "standard"); List> result = tuples.get(0).getElements(); assertEquals(2, result.size()); @@ -374,8 +342,8 @@ public void testGetElementsWithNamedNativeQueryShouldWorkProperly() { } @Test - public void testStreamedPositionalGetterShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedPositionalGetterShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedTupleResult(entityManager); Tuple tuple = result.get(0); assertEquals(1L, tuple.get(0)); @@ -384,8 +352,8 @@ public void testStreamedPositionalGetterShouldWorkProperly() { } @Test - public void testStreamedPositionalGetterWithClassShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedPositionalGetterWithClassShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedTupleResult(entityManager); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get(0, Long.class)); @@ -393,70 +361,51 @@ public void testStreamedPositionalGetterWithClassShouldWorkProperly() { }); } - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterShouldThrowExceptionWhenLessThanZeroGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(-1); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithClassShouldThrowExceptionWhenLessThanZeroGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(-1); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterShouldThrowExceptionWhenTupleSizePositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(2); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithClassShouldThrowExceptionWhenTupleSizePositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(2); + @Test + public void testStreamedPositionalGetterShouldThrowExceptionWhenLessThanZeroGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getStreamedTupleResult(entityManager); + Tuple tuple = result.get(0); + tuple.get(-1); + } + ); }); } - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterShouldThrowExceptionWhenExceedingPositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(3); + @Test + public void testStreamedPositionalGetterShouldThrowExceptionWhenTupleSizePositionGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getStreamedTupleResult(entityManager); + Tuple tuple = result.get(0); + tuple.get(2); + } + ); }); } - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithClassShouldThrowExceptionWhenExceedingPositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get(3); + @Test + public void testStreamedPositionalGetterShouldThrowExceptionWhenExceedingPositionGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getStreamedTupleResult(entityManager); + Tuple tuple = result.get(0); + tuple.get(3); + } + ); }); } - @Test - public void testStreamedAliasGetterWithoutExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithoutExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedTupleResult(entityManager); Tuple tuple = result.get(0); assertEquals(1L, tuple.get("ID")); @@ -465,26 +414,31 @@ public void testStreamedAliasGetterWithoutExplicitAliasShouldWorkProperly() { } @Test - public void testStreamedAliasGetterShouldWorkWithoutExplicitAliasWhenLowerCaseAliasGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterShouldWorkWithoutExplicitAliasWhenLowerCaseAliasGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedTupleResult(entityManager); Tuple tuple = result.get(0); tuple.get("id"); }); } - @Test(expected = IllegalArgumentException.class) - public void testStreamedAliasGetterShouldThrowExceptionWithoutExplicitAliasWhenWrongAliasGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedTupleResult(entityManager); - Tuple tuple = result.get(0); - tuple.get("e"); + @Test + public void testStreamedAliasGetterShouldThrowExceptionWithoutExplicitAliasWhenWrongAliasGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getStreamedTupleResult(entityManager); + Tuple tuple = result.get(0); + tuple.get("e"); + } + ); }); } @Test - public void testStreamedAliasGetterWithClassWithoutExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithClassWithoutExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedTupleResult(entityManager); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get("ID", Long.class)); @@ -492,10 +446,9 @@ public void testStreamedAliasGetterWithClassWithoutExplicitAliasShouldWorkProper }); } - @Test - public void testStreamedAliasGetterWithExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleAliasedResult(entityManager); Tuple tuple = result.get(0); assertEquals(1L, tuple.get("ALIAS1")); @@ -504,8 +457,8 @@ public void testStreamedAliasGetterWithExplicitAliasShouldWorkProperly() { } @Test - public void testStreamedAliasGetterWithClassWithExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithClassWithExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getTupleAliasedResult(entityManager); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get("ALIAS1", Long.class)); @@ -514,8 +467,8 @@ public void testStreamedAliasGetterWithClassWithExplicitAliasShouldWorkProperly( } @Test - public void testStreamedToArrayShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedToArrayShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List tuples = getStreamedTupleResult(entityManager); Object[] result = tuples.get(0).toArray(); assertArrayEquals(new Object[]{1L, "Arnold"}, result); @@ -523,8 +476,8 @@ public void testStreamedToArrayShouldWorkProperly() { } @Test - public void testStreamedGetElementsShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedGetElementsShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List tuples = getStreamedTupleResult(entityManager); List> result = tuples.get(0).getElements(); assertEquals(2, result.size()); @@ -536,8 +489,8 @@ public void testStreamedGetElementsShouldWorkProperly() { } @Test - public void testStreamedPositionalGetterWithNamedNativeQueryShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedPositionalGetterWithNamedNativeQueryShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedNamedTupleResult(entityManager, "standard"); Tuple tuple = result.get(0); assertEquals(1L, tuple.get(0)); @@ -546,8 +499,8 @@ public void testStreamedPositionalGetterWithNamedNativeQueryShouldWorkProperly() } @Test - public void testStreamedPositionalGetterWithNamedNativeQueryWithClassShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedPositionalGetterWithNamedNativeQueryWithClassShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedNamedTupleResult(entityManager, "standard"); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get(0, Long.class)); @@ -555,70 +508,51 @@ public void testStreamedPositionalGetterWithNamedNativeQueryWithClassShouldWorkP }); } - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenLessThanZeroGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedNamedTupleResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(-1); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithNamedNativeQueryWithClassShouldThrowExceptionWhenLessThanZeroGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedNamedTupleResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(-1); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenTupleSizePositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedNamedTupleResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(2); - }); - } - - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithNamedNativeQueryWithClassShouldThrowExceptionWhenTupleSizePositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedNamedTupleResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(2); + @Test + public void testStreamedPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenLessThanZeroGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getStreamedNamedTupleResult(entityManager, "standard"); + Tuple tuple = result.get(0); + tuple.get(-1); + } + ); }); } - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenExceedingPositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedNamedTupleResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(3); + @Test + public void testStreamedPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenTupleSizePositionGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getStreamedNamedTupleResult(entityManager, "standard"); + Tuple tuple = result.get(0); + tuple.get(2); + } + ); }); } - - @Test(expected = IllegalArgumentException.class) - public void testStreamedPositionalGetterWithNamedNativeQueryWithClassShouldThrowExceptionWhenExceedingPositionGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedNamedTupleResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get(3); + @Test + public void testStreamedPositionalGetterWithNamedNativeQueryShouldThrowExceptionWhenExceedingPositionGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getStreamedNamedTupleResult(entityManager, "standard"); + Tuple tuple = result.get(0); + tuple.get(3); + } + ); }); } - @Test - public void testStreamedAliasGetterWithNamedNativeQueryWithoutExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithNamedNativeQueryWithoutExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedNamedTupleResult(entityManager, "standard"); Tuple tuple = result.get(0); assertEquals(1L, tuple.get("ID")); @@ -627,26 +561,31 @@ public void testStreamedAliasGetterWithNamedNativeQueryWithoutExplicitAliasShoul } @Test - public void testStreamedAliasGetterWithNamedNativeQueryShouldWorkWithoutExplicitAliasWhenLowerCaseAliasGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithNamedNativeQueryShouldWorkWithoutExplicitAliasWhenLowerCaseAliasGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedNamedTupleResult(entityManager, "standard"); Tuple tuple = result.get(0); tuple.get("id"); }); } - @Test(expected = IllegalArgumentException.class) - public void testStreamedAliasGetterWithNamedNativeQueryShouldThrowExceptionWithoutExplicitAliasWhenWrongAliasGiven() { - doInJPA(this::entityManagerFactory, entityManager -> { - List result = getStreamedNamedTupleResult(entityManager, "standard"); - Tuple tuple = result.get(0); - tuple.get("e"); + @Test + public void testStreamedAliasGetterWithNamedNativeQueryShouldThrowExceptionWithoutExplicitAliasWhenWrongAliasGiven(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + assertThrows( + IllegalArgumentException.class, + () -> { + List result = getStreamedNamedTupleResult(entityManager, "standard"); + Tuple tuple = result.get(0); + tuple.get("e"); + } + ); }); } @Test - public void testStreamedAliasGetterWithNamedNativeQueryWithClassWithoutExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithNamedNativeQueryWithClassWithoutExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedNamedTupleResult(entityManager, "standard"); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get("ID", Long.class)); @@ -654,10 +593,9 @@ public void testStreamedAliasGetterWithNamedNativeQueryWithClassWithoutExplicitA }); } - @Test - public void testStreamedAliasGetterWithNamedNativeQueryWithExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithNamedNativeQueryWithExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedNamedTupleResult(entityManager, "standard_with_alias"); Tuple tuple = result.get(0); assertEquals(1L, tuple.get("ALIAS1")); @@ -666,8 +604,8 @@ public void testStreamedAliasGetterWithNamedNativeQueryWithExplicitAliasShouldWo } @Test - public void testStreamedAliasGetterWithNamedNativeQueryWithClassWithExplicitAliasShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedAliasGetterWithNamedNativeQueryWithClassWithExplicitAliasShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List result = getStreamedNamedTupleResult(entityManager, "standard_with_alias"); Tuple tuple = result.get(0); assertEquals(Long.valueOf(1L), tuple.get("ALIAS1", Long.class)); @@ -676,8 +614,8 @@ public void testStreamedAliasGetterWithNamedNativeQueryWithClassWithExplicitAlia } @Test - public void testStreamedToArrayShouldWithNamedNativeQueryWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedToArrayShouldWithNamedNativeQueryWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List tuples = getStreamedNamedTupleResult(entityManager, "standard"); Object[] result = tuples.get(0).toArray(); assertArrayEquals(new Object[]{1L, "Arnold"}, result); @@ -685,8 +623,8 @@ public void testStreamedToArrayShouldWithNamedNativeQueryWorkProperly() { } @Test - public void testStreamedGetElementsWithNamedNativeQueryShouldWorkProperly() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testStreamedGetElementsWithNamedNativeQueryShouldWorkProperly(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { List tuples = getStreamedNamedTupleResult(entityManager, "standard"); List> result = tuples.get(0).getElements(); assertEquals(2, result.size()); @@ -699,12 +637,12 @@ public void testStreamedGetElementsWithNamedNativeQueryShouldWorkProperly() { @Test @JiraKey(value = "HHH-11897") - public void testGetElementsShouldNotThrowExceptionWhenResultContainsNullValue() { - doInJPA(this::entityManagerFactory, entityManager -> { + public void testGetElementsShouldNotThrowExceptionWhenResultContainsNullValue(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { User user = entityManager.find(User.class, 1L); user.firstName = null; }); - doInJPA(this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { List tuples = getTupleResult(entityManager); final Tuple tuple = tuples.get(0); List> result = tuple.getElements(); @@ -741,7 +679,6 @@ private List getTupleResult(EntityManager entityManager) { return (List) query.getResultList(); } - @SuppressWarnings("unchecked") private List getTupleNamedResult(EntityManager entityManager, String name) { return entityManager.createNamedQuery(name, Tuple.class).getResultList(); } @@ -769,6 +706,7 @@ private List getStreamedNamedTupleResult(EntityManager entityManager, Str query = "SELECT id AS alias1, firstname AS alias2 FROM users" ) }) + public static class User { @Id private long id; diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/TypedValueParametersTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/TypedValueParametersTest.java index 64101cf1f4d8..fe4400ca135a 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/TypedValueParametersTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/query/TypedValueParametersTest.java @@ -198,7 +198,6 @@ public List assemble(final Serializable cached, final Object owner) thro } @Override - @SuppressWarnings("unchecked") public List deepCopy(final List o) throws HibernateException { return o == null ? null : new ArrayList<>( o ); } From 18f301e46f9403e9b0cd8465c745b26f427c5391 Mon Sep 17 00:00:00 2001 From: Jan Schatteman Date: Fri, 24 Oct 2025 00:06:18 +0200 Subject: [PATCH 2/6] HHH-19846 - Drop JUnit 4 usage: org.hibernate.orm.test.jpa.spi/test/userguide Signed-off-by: Jan Schatteman --- .../spi/NativeQueryTupleTransformerTest.java | 26 ++-- .../components/ComponentCriteriaTest.java | 87 +++++------ .../jpa/userguide/util/GetIdentifierTest.java | 143 +++++++----------- .../test/jpa/userguide/util/IsLoadedTest.java | 60 ++++---- .../util/PersistenceUtilHelperTest.java | 4 +- .../util/PessimisticNumberParserUnitTest.java | 6 +- .../jpa/userguide/util/ProviderUtilTest.java | 19 +-- 7 files changed, 153 insertions(+), 192 deletions(-) diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/spi/NativeQueryTupleTransformerTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/spi/NativeQueryTupleTransformerTest.java index 8436f7276005..db9ca0028bc7 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/spi/NativeQueryTupleTransformerTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/spi/NativeQueryTupleTransformerTest.java @@ -4,14 +4,15 @@ */ package org.hibernate.orm.test.jpa.spi; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; - import jakarta.persistence.Tuple; import org.hibernate.jpa.spi.NativeQueryTupleTransformer; -import org.junit.Test; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * @author Maksym Symonov @@ -22,7 +23,7 @@ public class NativeQueryTupleTransformerTest { @Test public void nullValueIsExtractedFromTuple() { - final Tuple tuple = (Tuple) nativeQueryTupleTransformer.transformTuple( + final Tuple tuple = nativeQueryTupleTransformer.transformTuple( new Object[] { 1L, null }, new String[] { "id", "value" } ); @@ -30,12 +31,17 @@ public void nullValueIsExtractedFromTuple() { assertNull(tuple.get("value")); } - @Test(expected = IllegalArgumentException.class) + @Test public void missingAliasCausesExceptionWhenIsExtractedFromTuple() { - final Tuple tuple = (Tuple) nativeQueryTupleTransformer.transformTuple( - new Object[] { 1L, null }, - new String[] { "id", "value" } + assertThrows( + IllegalArgumentException.class, + () -> { + final Tuple tuple = nativeQueryTupleTransformer.transformTuple( + new Object[] {1L, null}, + new String[] {"id", "value"} + ); + tuple.get( "unknownAlias" ); + } ); - tuple.get("unknownAlias"); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/test/components/ComponentCriteriaTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/test/components/ComponentCriteriaTest.java index f2e2d140ed12..78ff33262007 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/test/components/ComponentCriteriaTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/test/components/ComponentCriteriaTest.java @@ -12,121 +12,116 @@ import jakarta.persistence.criteria.Root; import org.hibernate.Hibernate; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Assert; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author alan.oleary */ -public class ComponentCriteriaTest extends BaseEntityManagerFunctionalTestCase { - @Override - public Class[] getAnnotatedClasses() { - return new Class[] { Client.class, Alias.class }; +@Jpa(annotatedClasses = {Client.class, Alias.class}) +public class ComponentCriteriaTest { + + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testEmbeddableInPath() { + public void testEmbeddableInPath(EntityManagerFactoryScope scope) { Client client = new Client( 111, "steve", "ebersole" ); - doInJPA( this::entityManagerFactory, em -> { - em.persist( client ); - } ); + scope.inTransaction( entityManager -> entityManager.persist( client ) ); - doInJPA( this::entityManagerFactory, em -> { - CriteriaBuilder cb = em.getCriteriaBuilder(); + scope.inTransaction( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery( Client.class ); Root root = cq.from( Client.class ); cq.where( cb.equal( root.get( "name" ).get( "firstName" ), client.getName().getFirstName() ) ); - List list = em.createQuery( cq ).getResultList(); - Assert.assertEquals( 1, list.size() ); + List list = entityManager.createQuery( cq ).getResultList(); + assertEquals( 1, list.size() ); } ); // HHH-5792 - doInJPA( this::entityManagerFactory, em -> { - TypedQuery q = em.createQuery( + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( "SELECT c FROM Client c JOIN c.name n WHERE n.firstName = '" + client.getName().getFirstName() + "'", Client.class ); - Assert.assertEquals( 1, q.getResultList().size() ); - } ); - - doInJPA( this::entityManagerFactory, em -> { - em.createQuery( "delete Client" ).executeUpdate(); + assertEquals( 1, q.getResultList().size() ); } ); } @Test @JiraKey(value = "HHH-9642") - public void testOneToManyJoinFetchedInEmbeddable() { + public void testOneToManyJoinFetchedInEmbeddable(EntityManagerFactoryScope scope) { Client client = new Client( 111, "steve", "ebersole" ); Alias alias = new Alias( "a", "guy", "work" ); client.getName().getAliases().add( alias ); - doInJPA( this::entityManagerFactory, em -> { - em.persist( client ); - } ); + scope.inTransaction( entityManager -> entityManager.persist( client ) ); List list = new ArrayList<>(); - doInJPA( this::entityManagerFactory, em -> { - CriteriaBuilder cb = em.getCriteriaBuilder(); + scope.inTransaction( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery( Client.class ); Root root = cq.from( Client.class ); root.fetch( Client_.name ).fetch( Name_.aliases ); cq.where( cb.equal( root.get( "name" ).get( "firstName" ), client.getName().getFirstName() ) ); - list.addAll( em.createQuery( cq ).getResultList() ); - Assert.assertEquals( 1, list.size() ); + list.addAll( entityManager.createQuery( cq ).getResultList() ); + assertEquals( 1, list.size() ); Client c = list.get( 0 ); assertTrue( Hibernate.isInitialized( c.getName().getAliases() ) ); } ); - doInJPA( this::entityManagerFactory, em -> { - TypedQuery q = em.createQuery( + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( "SELECT c FROM Client c JOIN FETCH c.name.aliases WHERE c.name.firstName = '" + client.getName().getFirstName() + "'", Client.class ); - Assert.assertEquals( 1, q.getResultList().size() ); + assertEquals( 1, q.getResultList().size() ); Client c = list.get( 0 ); assertTrue( Hibernate.isInitialized( c.getName().getAliases() ) ); } ); - doInJPA( this::entityManagerFactory, em -> { - TypedQuery q = em.createQuery( + scope.inTransaction( entityManager -> { + TypedQuery q = entityManager.createQuery( "SELECT c FROM Client c JOIN c.name n join FETCH n.aliases WHERE c.name.firstName = '" + client.getName().getFirstName() + "'", Client.class ); - Assert.assertEquals( 1, q.getResultList().size() ); + assertEquals( 1, q.getResultList().size() ); Client c = list.get( 0 ); assertTrue( Hibernate.isInitialized( c.getName().getAliases() ) ); } ); - doInJPA( this::entityManagerFactory, em -> { - Client c = em.merge( client ); - em.remove( c ); + scope.inTransaction( entityManager -> { + Client c = entityManager.merge( client ); + entityManager.remove( c ); } ); } @Test @JiraKey(value = "HHH-4586") - public void testParameterizedFunctions() { - doInJPA( this::entityManagerFactory, em -> { - CriteriaBuilder cb = em.getCriteriaBuilder(); + public void testParameterizedFunctions(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); // lower CriteriaQuery cq = cb.createQuery( Client.class ); Root root = cq.from( Client.class ); cq.where( cb.equal( cb.lower( root.get( Client_.name ).get( Name_.lastName ) ), "test" ) ); - em.createQuery( cq ).getResultList(); + entityManager.createQuery( cq ).getResultList(); // upper cq = cb.createQuery( Client.class ); root = cq.from( Client.class ); cq.where( cb.equal( cb.upper( root.get( Client_.name ).get( Name_.lastName ) ), "test" ) ); - em.createQuery( cq ).getResultList(); + entityManager.createQuery( cq ).getResultList(); } ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/GetIdentifierTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/GetIdentifierTest.java index e61b38b069da..67b114e8f780 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/GetIdentifierTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/GetIdentifierTest.java @@ -4,131 +4,102 @@ */ package org.hibernate.orm.test.jpa.userguide.util; -import jakarta.persistence.EntityManager; - -import org.junit.Test; - -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; import org.hibernate.proxy.HibernateProxy; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; /** * @author Emmanuel Bernard */ -public class GetIdentifierTest extends BaseEntityManagerFunctionalTestCase { +@Jpa(annotatedClasses = { + Book.class, + Umbrella.class, + Sickness.class, + Author.class, + Article.class +}) +public class GetIdentifierTest { + + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); + } + @Test - public void testSimpleId() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - try { + public void testSimpleId(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Book book = new Book(); - em.persist( book ); - em.flush(); - assertEquals( book.getId(), em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( book ) ); - } - finally { - em.getTransaction().rollback(); - em.close(); - } + entityManager.persist( book ); + entityManager.flush(); + assertEquals( book.getId(), entityManager.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( book ) ); + } ); } @Test @JiraKey(value = "HHH-7561") - public void testProxyObject() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - try { + public void testProxyObject(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Book book = new Book(); - em.persist( book ); - em.flush(); - em.clear(); // Clear persistence context to receive proxy object below. - Book proxy = em.getReference( Book.class, book.getId() ); - assertTrue( proxy instanceof HibernateProxy ); - assertEquals( book.getId(), em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( proxy ) ); - } - finally { - em.getTransaction().rollback(); - em.close(); - } + entityManager.persist( book ); + entityManager.flush(); + entityManager.clear(); // Clear persistence context to receive proxy object below. + Book proxy = entityManager.getReference( Book.class, book.getId() ); + assertInstanceOf( HibernateProxy.class, proxy ); + assertEquals( book.getId(), entityManager.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( proxy ) ); + } ); - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - try { + scope.inTransaction( entityManager -> { Author author = new Author(); Article article = new Article( author ); - em.persist( author ); - em.persist( article ); - em.flush(); - em.clear(); // Clear persistence context to receive proxy relation below. - article = em.find( Article.class, article.getId() ); - assertTrue( article.getAuthor() instanceof HibernateProxy ); + entityManager.persist( author ); + entityManager.persist( article ); + entityManager.flush(); + entityManager.clear(); // Clear persistence context to receive proxy relation below. + article = entityManager.find( Article.class, article.getId() ); + assertInstanceOf( HibernateProxy.class, article.getAuthor() ); assertEquals( author.getId(), - em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( article.getAuthor() ) + entityManager.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( article.getAuthor() ) ); - - } - finally { - em.getTransaction().rollback(); - em.close(); - } + } ); } @Test - public void testEmbeddedId() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - try { + public void testEmbeddedId(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Umbrella umbrella = new Umbrella(); umbrella.setId( new Umbrella.PK() ); umbrella.getId().setBrand( "Burberry" ); umbrella.getId().setModel( "Red Hat" ); - em.persist( umbrella ); - em.flush(); + entityManager.persist( umbrella ); + entityManager.flush(); assertEquals( umbrella.getId(), - em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( umbrella ) + entityManager.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( umbrella ) ); - } - finally { - em.getTransaction().rollback(); - em.close(); - } + } ); } @Test - public void testIdClass() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - try { + public void testIdClass(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Sickness sick = new Sickness(); - sick.setClassification( "H1N1" ); sick.setType( "Flu" ); - em.persist( sick ); - em.flush(); + entityManager.persist( sick ); + entityManager.flush(); Sickness.PK id = new Sickness.PK(); id.setClassification( sick.getClassification() ); id.setType( sick.getType() ); - assertEquals( id, em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( sick ) ); - } - finally { - em.getTransaction().rollback(); - em.close(); - } + assertEquals( id, entityManager.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier( sick ) ); + } ); } - @Override - public Class[] getAnnotatedClasses() { - return new Class[] { - Book.class, - Umbrella.class, - Sickness.class, - Author.class, - Article.class - }; - } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/IsLoadedTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/IsLoadedTest.java index a68ea4decbd6..037bdf2f19bd 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/IsLoadedTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/IsLoadedTest.java @@ -4,46 +4,42 @@ */ package org.hibernate.orm.test.jpa.userguide.util; -import jakarta.persistence.EntityManager; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; -import org.junit.Test; - -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author Emmanuel Bernard */ -public class IsLoadedTest extends BaseEntityManagerFunctionalTestCase { +@Jpa(annotatedClasses = { + Author.class, + Book.class, + CopyrightableContent.class +}) +public class IsLoadedTest { + + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); + } + @Test - public void testIsLoadedOnPrivateSuperclassProperty() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - try { + public void testIsLoadedOnPrivateSuperclassProperty(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Author a = new Author(); Book book = new Book( a ); - em.persist( a ); - em.persist( book ); - em.flush(); - em.clear(); - book = em.find( Book.class, book.getId() ); - assertTrue( em.getEntityManagerFactory().getPersistenceUnitUtil().isLoaded( book ) ); - assertFalse( em.getEntityManagerFactory().getPersistenceUnitUtil().isLoaded( book, "author" ) ); - } - finally { - em.getTransaction().rollback(); - em.close(); - } + entityManager.persist( a ); + entityManager.persist( book ); + entityManager.flush(); + entityManager.clear(); + book = entityManager.find( Book.class, book.getId() ); + assertTrue( entityManager.getEntityManagerFactory().getPersistenceUnitUtil().isLoaded( book ) ); + assertFalse( entityManager.getEntityManagerFactory().getPersistenceUnitUtil().isLoaded( book, "author" ) ); + } ); } - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { - Author.class, - Book.class, - CopyrightableContent.class - }; - } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/PersistenceUtilHelperTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/PersistenceUtilHelperTest.java index 79e0a2739904..dceac4aa3fb9 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/PersistenceUtilHelperTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/PersistenceUtilHelperTest.java @@ -10,9 +10,9 @@ import org.hibernate.engine.spi.PersistentAttributeInterceptor; import org.hibernate.jpa.internal.util.PersistenceUtilHelper; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Tests for HHH-5094 and HHH-5334 diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/PessimisticNumberParserUnitTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/PessimisticNumberParserUnitTest.java index ff24c82abbed..fcad62e857f4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/PessimisticNumberParserUnitTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/PessimisticNumberParserUnitTest.java @@ -4,11 +4,11 @@ */ package org.hibernate.orm.test.jpa.userguide.util; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; import org.hibernate.jpa.internal.util.PessimisticNumberParser; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * @author Sanne Grinovero diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/ProviderUtilTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/ProviderUtilTest.java index 0f08a06446de..a90079023dc5 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/ProviderUtilTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/userguide/util/ProviderUtilTest.java @@ -8,17 +8,18 @@ import jakarta.persistence.spi.LoadState; import org.hibernate.jpa.internal.util.PersistenceUtilHelper; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author Steve Ebersole */ -public class ProviderUtilTest extends BaseEntityManagerFunctionalTestCase { +@Jpa(annotatedClasses = {Author.class}) +public class ProviderUtilTest { private final PersistenceUtilHelper.MetadataCache cache = new PersistenceUtilHelper.MetadataCache(); @@ -60,12 +61,4 @@ public void testIsLoadedWithReferenceOnKnownClass() { assertEquals( LoadState.UNKNOWN, PersistenceUtilHelper.isLoadedWithReference( entity, "attribute", cache ) ); } - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { - Author.class, - Book.class, - CopyrightableContent.class - }; - } } From ae3ce50fb0503bee421067bde90a9c7b29ea978a Mon Sep 17 00:00:00 2001 From: Jan Schatteman Date: Fri, 24 Oct 2025 17:50:06 +0200 Subject: [PATCH 3/6] HHH-19846 - Drop JUnit 4 usage: org.hibernate.orm.test.jpa.transaction/version/xml Signed-off-by: Jan Schatteman --- ...ntityManagerWithActiveTransactionTest.java | 10 +- .../transaction/FlushAndTransactionTest.java | 526 +++++++++--------- .../JtaReusingEntityTransactionTest.java | 2 +- .../TransactionCommitFailureTest.java | 8 +- .../transaction/TransactionRollbackTest.java | 4 +- .../JpaSpecVersionValueUpdatingTest.java | 184 +++--- .../jpa/xml/versions/JpaXsdVersionsTest.java | 23 +- 7 files changed, 365 insertions(+), 392 deletions(-) diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/CloseEntityManagerWithActiveTransactionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/CloseEntityManagerWithActiveTransactionTest.java index 15bd24bc677b..1143554aa194 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/CloseEntityManagerWithActiveTransactionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/CloseEntityManagerWithActiveTransactionTest.java @@ -119,7 +119,7 @@ public void testPersistThenCloseWithAnActiveTransaction(EntityManagerFactoryScop } scope.inEntityManager( em -> { - final List results = em.createQuery( "from Box" ).getResultList(); + final List results = em.createQuery( "from Box", Box.class ).getResultList(); assertThat( results.size(), is( 1 ) ); } ); @@ -160,7 +160,7 @@ public void testMergeThenCloseWithAnActiveTransaction(EntityManagerFactoryScope scope.inEntityManager( em -> { - final List boxes = em.createQuery( "from Box" ).getResultList(); + final List boxes = em.createQuery( "from Box", Box.class ).getResultList(); assertThat( boxes.size(), is( 1 ) ); assertThat( boxes.get( 0 ).getMuffinSet().size(), is( 1 ) ); } @@ -202,7 +202,7 @@ public void testMergeWithDeletionOrphanRemovalThenCloseWithAnActiveTransaction(E scope.inEntityManager( em -> { - final List boxes = em.createQuery( "from SmallBox" ).getResultList(); + final List boxes = em.createQuery( "from SmallBox", SmallBox.class ).getResultList(); assertThat( boxes.size(), is( 1 ) ); assertTrue( boxes.get( 0 ).isEmpty() ); } @@ -243,7 +243,7 @@ public void testUpdateThenCloseWithAnActiveTransaction(EntityManagerFactoryScope scope.inEntityManager( em -> { - final List boxes = em.createQuery( "from Box" ).getResultList(); + final List boxes = em.createQuery( "from Box", Box.class ).getResultList(); assertThat( boxes.size(), is( 1 ) ); assertThat( boxes.get( 0 ).getMuffinSet().size(), is( 1 ) ); } @@ -286,7 +286,7 @@ public void testRemoveThenCloseWithAnActiveTransaction(EntityManagerFactoryScope scope.inEntityManager( em -> { - final List boxes = em.createQuery( "from Box" ).getResultList(); + final List boxes = em.createQuery( "from Box", Box.class ).getResultList(); assertThat( boxes.size(), is( 0 ) ); } ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/FlushAndTransactionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/FlushAndTransactionTest.java index 71968496f37d..270701ef9c40 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/FlushAndTransactionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/FlushAndTransactionTest.java @@ -4,18 +4,6 @@ */ package org.hibernate.orm.test.jpa.transaction; -import java.util.List; -import java.util.Map; - -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.StaleObjectStateException; -import org.hibernate.cfg.AvailableSettings; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; -import org.hibernate.stat.Statistics; - -import org.junit.Test; - import jakarta.persistence.EntityManager; import jakarta.persistence.LockModeType; import jakarta.persistence.OptimisticLockException; @@ -24,307 +12,307 @@ import jakarta.persistence.RollbackException; import jakarta.persistence.TransactionRequiredException; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.StaleObjectStateException; +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.stat.Statistics; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.Setting; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author Emmanuel Bernard */ -public class FlushAndTransactionTest extends BaseEntityManagerFunctionalTestCase { - @Test - public void testAlwaysTransactionalOperations() { - Book book = new Book(); - book.name = "Le petit prince"; - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( book ); - em.getTransaction().commit(); - try { - em.flush(); - fail( "flush has to be inside a Tx" ); - } - catch (TransactionRequiredException e) { - //success - } - try { - em.lock( book, LockModeType.READ ); - fail( "lock has to be inside a Tx" ); - } - catch (TransactionRequiredException e) { - //success - } - em.getTransaction().begin(); - em.remove( em.find( Book.class, book.id ) ); - em.getTransaction().commit(); - em.close(); +@Jpa( + annotatedClasses = {Book.class}, + integrationSettings = {@Setting(name = AvailableSettings.JPA_TRANSACTION_COMPLIANCE, value = "true")}, + generateStatistics = true +) +public class FlushAndTransactionTest { + + @AfterEach + public void afterEach(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testTransactionalOperationsWhenExtended() { - Book book = new Book(); - book.name = "Le petit prince"; - EntityManager em = getOrCreateEntityManager(); - Statistics stats = entityManagerFactory().unwrap( SessionFactory.class ).getStatistics(); - stats.clear(); - stats.setStatisticsEnabled( true ); - - em.persist( book ); - assertEquals( 0, stats.getEntityInsertCount() ); - em.getTransaction().begin(); - em.flush(); - em.getTransaction().commit(); - assertEquals( 1, stats.getEntityInsertCount() ); - - em.clear(); - book.name = "Le prince"; - book = em.merge( book ); - - em.refresh( book ); - assertEquals( 0, stats.getEntityUpdateCount() ); - em.getTransaction().begin(); - em.flush(); - em.getTransaction().commit(); - assertEquals( 0, stats.getEntityUpdateCount() ); - - book.name = "Le prince"; - em.getTransaction().begin(); - em.find( Book.class, book.id ); - em.getTransaction().commit(); - assertEquals( 1, stats.getEntityUpdateCount() ); - - em.remove( book ); - assertEquals( 0, stats.getEntityDeleteCount() ); - em.getTransaction().begin(); - em.flush(); - em.getTransaction().commit(); - assertEquals( 1, stats.getEntityDeleteCount() ); - - em.close(); - stats.setStatisticsEnabled( false ); + public void testAlwaysTransactionalOperations(EntityManagerFactoryScope scope) { + scope.inEntityManager( + entityManager -> { + Book book = new Book(); + book.name = "Le petit prince"; + entityManager.getTransaction().begin(); + entityManager.persist( book ); + entityManager.getTransaction().commit(); + + assertThrows( + TransactionRequiredException.class, + entityManager::flush + ); + + assertThrows( + TransactionRequiredException.class, + () -> entityManager.lock( book, LockModeType.READ ) + ); + } + ); } @Test - public void testMergeWhenExtended() { - Book book = new Book(); - book.name = "Le petit prince"; - EntityManager em = getOrCreateEntityManager(); - Statistics stats = entityManagerFactory().unwrap( SessionFactory.class ).getStatistics(); - - em.getTransaction().begin(); - em.persist( book ); - assertEquals( 0, stats.getEntityInsertCount() ); - em.getTransaction().commit(); - - em.clear(); //persist and clear + public void testTransactionalOperationsWhenExtended(EntityManagerFactoryScope scope) { + Statistics stats = scope.getEntityManagerFactory().unwrap( SessionFactory.class ).getStatistics(); stats.clear(); - stats.setStatisticsEnabled( true ); - - Book bookReloaded = em.find( Book.class, book.id ); - - book.name = "Le prince"; - assertEquals( "Merge should use the available entiies in the PC", em.merge( book ), bookReloaded ); - assertEquals( book.name, bookReloaded.name ); - - assertEquals( 0, stats.getEntityDeleteCount() ); - assertEquals( 0, stats.getEntityInsertCount() ); - assertEquals( "Updates should have been queued", 0, stats.getEntityUpdateCount() ); - - em.getTransaction().begin(); - Book bookReReloaded = em.find( Book.class, bookReloaded.id ); - assertEquals( "reload should return the object in PC", bookReReloaded, bookReloaded ); - assertEquals( bookReReloaded.name, bookReloaded.name ); - em.getTransaction().commit(); - - assertEquals( 0, stats.getEntityDeleteCount() ); - assertEquals( 0, stats.getEntityInsertCount() ); - assertEquals( "Work on Tx should flush", 1, stats.getEntityUpdateCount() ); - em.getTransaction().begin(); - em.remove( bookReReloaded ); - em.getTransaction().commit(); - - em.close(); - stats.setStatisticsEnabled( false ); + scope.inEntityManager( + entityManager -> { + Book book = new Book(); + book.name = "Le petit prince"; + entityManager.persist( book ); + assertEquals( 0, stats.getEntityInsertCount() ); + + entityManager.getTransaction().begin(); + entityManager.flush(); + entityManager.getTransaction().commit(); + assertEquals( 1, stats.getEntityInsertCount() ); + + entityManager.clear(); + book.name = "Le prince"; + book = entityManager.merge( book ); + + entityManager.refresh( book ); + assertEquals( 0, stats.getEntityUpdateCount() ); + entityManager.getTransaction().begin(); + entityManager.flush(); + entityManager.getTransaction().commit(); + assertEquals( 0, stats.getEntityUpdateCount() ); + + book.name = "Le prince"; + entityManager.getTransaction().begin(); + entityManager.find( Book.class, book.id ); + entityManager.getTransaction().commit(); + assertEquals( 1, stats.getEntityUpdateCount() ); + + entityManager.remove( book ); + assertEquals( 0, stats.getEntityDeleteCount() ); + entityManager.getTransaction().begin(); + entityManager.flush(); + entityManager.getTransaction().commit(); + assertEquals( 1, stats.getEntityDeleteCount() ); + } + ); } @Test - public void testCloseAndTransaction() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - Book book = new Book(); - book.name = "Java for Dummies"; - em.close(); - - assertFalse( em.isOpen() ); - try { - em.flush(); - fail( "direct action on a closed em should fail" ); - } - catch (IllegalStateException e) { - //success - } - finally { - if ( em.getTransaction().isActive() ) { - em.getTransaction().rollback(); + public void testMergeWhenExtended(EntityManagerFactoryScope scope) { + Statistics stats = scope.getEntityManagerFactory().unwrap( SessionFactory.class ).getStatistics(); + + scope.inEntityManager( + entityManager -> { + Book book = new Book(); + book.name = "Le petit prince"; + + entityManager.getTransaction().begin(); + entityManager.persist( book ); + assertEquals( 0, stats.getEntityInsertCount() ); + entityManager.getTransaction().commit(); + + entityManager.clear(); //persist and clear + stats.clear(); + + Book bookReloaded = entityManager.find( Book.class, book.id ); + book.name = "Le prince"; + assertEquals( entityManager.merge( book ), bookReloaded, + "Merge should use the available entiies in the PC" ); + assertEquals( book.name, bookReloaded.name ); + + assertEquals( 0, stats.getEntityDeleteCount() ); + assertEquals( 0, stats.getEntityInsertCount() ); + assertEquals( 0, stats.getEntityUpdateCount(), "Updates should have been queued" ); + + entityManager.getTransaction().begin(); + Book bookReReloaded = entityManager.find( Book.class, bookReloaded.id ); + assertEquals( bookReReloaded, bookReloaded, "reload should return the object in PC" ); + assertEquals( bookReReloaded.name, bookReloaded.name ); + entityManager.getTransaction().commit(); + + assertEquals( 0, stats.getEntityDeleteCount() ); + assertEquals( 0, stats.getEntityInsertCount() ); + assertEquals( 1, stats.getEntityUpdateCount(), "Work in Tx should flush" ); } - } + ); } @Test - public void testTransactionCommitDoesNotFlush() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - Book book = new Book(); - book.name = "Java for Dummies"; - em.persist( book ); - em.getTransaction().commit(); - em.close(); - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - List result = em.createQuery( "select book from Book book where book.name = :title" ). - setParameter( "title", book.name ).getResultList(); - assertEquals( "EntityManager.commit() should trigger a flush()", 1, result.size() ); - em.getTransaction().commit(); - em.close(); + public void testCloseAndTransaction(EntityManagerFactoryScope scope) { + EntityManager entityManager = scope.fromEntityManager( + em -> { + em.getTransaction().begin(); + Book book = new Book(); + book.name = "Java for Dummies"; + return em; + } + ); + assertFalse( entityManager.isOpen() ); + + assertThrows( + IllegalStateException.class, + entityManager::flush, + "direct action on a closed em should fail" + ); } @Test - public void testTransactionAndContains() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - Book book = new Book(); - book.name = "Java for Dummies"; - em.persist( book ); - em.getTransaction().commit(); - em.close(); - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - List result = em.createQuery( "select book from Book book where book.name = :title" ). - setParameter( "title", book.name ).getResultList(); - assertEquals( "EntityManager.commit() should trigger a flush()", 1, result.size() ); - assertTrue( em.contains( result.get( 0 ) ) ); - em.getTransaction().commit(); - assertTrue( em.contains( result.get( 0 ) ) ); - em.close(); + public void testTransactionCommitDoesNotFlush(EntityManagerFactoryScope scope) { + Book book = scope.fromTransaction( entityManager -> { + Book _book = new Book(); + _book.name = "Java for Dummies"; + entityManager.persist( _book ); + return _book; + } ); + scope.inTransaction( entityManager -> { + List result = entityManager.createQuery( "select book from Book book where book.name = :title", Book.class ). + setParameter( "title", book.name ).getResultList(); + assertEquals( 1, result.size(), "EntityManager.commit() should trigger a flush()" ); + } ); } @Test - public void testRollbackOnlyOnPersistenceException() { + public void testTransactionAndContains(EntityManagerFactoryScope scope) { + Book book = scope.fromTransaction( entityManager -> { + Book _book = new Book(); + _book.name = "Java for Dummies"; + entityManager.persist( _book ); + return _book; + } ); + + scope.inEntityManager( entityManager -> { + entityManager.getTransaction().begin(); + List result = entityManager.createQuery( "select book from Book book where book.name = :title", Book.class ). + setParameter( "title", book.name ).getResultList(); + assertEquals( 1, result.size(), "EntityManager.commit() should trigger a flush()" ); + assertTrue( entityManager.contains( result.get( 0 ) ) ); + entityManager.getTransaction().commit(); + assertTrue( entityManager.contains( result.get( 0 ) ) ); + } ); + } + + @Test + public void testRollbackOnlyOnPersistenceException(EntityManagerFactoryScope scope) { Book book = new Book(); book.name = "Stolen keys"; book.id = null; //new Integer( 50 ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - try { - em.persist( book ); - em.flush(); - em.clear(); - book.setName( "kitty kid" ); - em.merge( book ); - em.flush(); - em.clear(); - book.setName( "kitty kid2" ); //non updated version - em.merge( book ); - em.flush(); - fail( "optimistic locking exception" ); - } - catch (PersistenceException e) { - //success - } - - try { - em.getTransaction().commit(); - fail( "Commit should be rollbacked" ); - } - catch (RollbackException e) { - //success - } - finally { - em.close(); - } + scope.inEntityManager( + entityManager -> { + entityManager.getTransaction().begin(); + + assertThrows( + PersistenceException.class, + () -> { + entityManager.persist( book ); + entityManager.flush(); + entityManager.clear(); + book.setName( "kitty kid" ); + entityManager.merge( book ); + entityManager.flush(); + entityManager.clear(); + book.setName( "kitty kid2" ); //non updated version + entityManager.merge( book ); + entityManager.flush(); + }, + "optimistic locking exception expected" + ); + + assertThrows( + RollbackException.class, + () -> entityManager.getTransaction().commit(), + "Commit should be rolled back" + ); + } + ); } @Test - public void testRollbackExceptionOnOptimisticLockException() { + public void testRollbackExceptionOnOptimisticLockException(EntityManagerFactoryScope scope) { Book book = new Book(); book.name = "Stolen keys"; book.id = null; //new Integer( 50 ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( book ); - em.flush(); - em.clear(); - book.setName( "kitty kid" ); - em.merge( book ); - em.flush(); - em.clear(); - book.setName( "kitty kid2" ); //non updated version - try { - em.unwrap( Session.class ).merge( book ); - em.getTransaction().commit(); - fail( "Commit should be rollbacked" ); - } - catch (OptimisticLockException e) { - assertTrue( - "During flush a StateStateException is wrapped into a OptimisticLockException", - e.getCause() instanceof StaleObjectStateException - ); - } - finally { - em.close(); - } - + scope.inEntityManager( + entityManager -> { + entityManager.getTransaction().begin(); + entityManager.persist( book ); + entityManager.flush(); + entityManager.clear(); + book.setName( "kitty kid" ); + entityManager.merge( book ); + entityManager.flush(); + entityManager.clear(); + book.setName( "kitty kid2" ); //non updated version + + assertInstanceOf( + StaleObjectStateException.class, + assertThrows( + OptimisticLockException.class, + () -> { + entityManager.unwrap( Session.class ).merge( book ); + entityManager.getTransaction().commit(); + }, + "Commit should be rolled back" + ).getCause(), + "During flush a StateStateException is wrapped into a OptimisticLockException" + ); + } + ); } @Test - public void testRollbackClearPC() { + public void testRollbackClearPC(EntityManagerFactoryScope scope) { Book book = new Book(); book.name = "Stolen keys"; - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( book ); - em.getTransaction().commit(); - em.getTransaction().begin(); - book.name = "Recovered keys"; - em.merge( book ); - em.getTransaction().rollback(); - em.getTransaction().begin(); - assertEquals( "Stolen keys", em.find( Book.class, book.id ).name ); - em.getTransaction().commit(); - em.close(); + scope.inEntityManager( + entityManager -> { + entityManager.getTransaction().begin(); + entityManager.persist( book ); + entityManager.getTransaction().commit(); + entityManager.getTransaction().begin(); + book.name = "Recovered keys"; + entityManager.merge( book ); + entityManager.getTransaction().rollback(); + entityManager.getTransaction().begin(); + assertEquals( "Stolen keys", entityManager.find( Book.class, book.id ).name ); + entityManager.getTransaction().commit(); + } + ); } @Test - public void testSetRollbackOnlyAndFlush() { + public void testSetRollbackOnlyAndFlush(EntityManagerFactoryScope scope) { Book book = new Book(); book.name = "The jungle book"; - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.getTransaction().setRollbackOnly(); - em.persist( book ); - em.flush(); - em.getTransaction().rollback(); - em.getTransaction().begin(); - Query query = em.createQuery( "SELECT b FROM Book b WHERE b.name = :name" ); - query.setParameter( "name", book.name ); - assertEquals( 0, query.getResultList().size() ); - em.getTransaction().commit(); - em.close(); - } - - - @Override - public Class[] getAnnotatedClasses() { - return new Class[] { - Book.class - }; + scope.inEntityManager( + entityManager -> { + entityManager.getTransaction().begin(); + entityManager.getTransaction().setRollbackOnly(); + entityManager.persist( book ); + entityManager.flush(); + entityManager.getTransaction().rollback(); + entityManager.getTransaction().begin(); + Query query = entityManager.createQuery( "SELECT b FROM Book b WHERE b.name = :name" ); + query.setParameter( "name", book.name ); + assertEquals( 0, query.getResultList().size() ); + entityManager.getTransaction().commit(); + } + ); } - @Override - protected void addConfigOptions(Map options) { - super.addConfigOptions( options ); - options.put( AvailableSettings.JPA_TRANSACTION_COMPLIANCE, "true" ); - } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/JtaReusingEntityTransactionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/JtaReusingEntityTransactionTest.java index 02cc409e6e44..6d73637420a5 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/JtaReusingEntityTransactionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/JtaReusingEntityTransactionTest.java @@ -65,7 +65,7 @@ public void entityTransactionShouldBeReusableTest(EntityManagerFactoryScope scop scope.inTransaction( entityManager -> { - List results = entityManager.createQuery( "from TestEntity" ).getResultList(); + List results = entityManager.createQuery( "from TestEntity", TestEntity.class ).getResultList(); assertThat( results.size(), is( 2 ) ); } ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionCommitFailureTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionCommitFailureTest.java index d52f72ab2925..fa6a1c0a2f19 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionCommitFailureTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionCommitFailureTest.java @@ -30,7 +30,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; @@ -83,7 +83,7 @@ public void assertConnectionIsReleasedIfCommitFails() { em.close(); } - assertEquals( false, connectionIsOpen.get(), "The connection was not released" ); + assertFalse( connectionIsOpen.get(), "The connection was not released" ); } @Test @@ -94,7 +94,7 @@ public void assertConnectionIsReleasedIfRollbackFails() { em.getTransaction().begin(); // Force connection acquisition em.createQuery( "select 1" ).getResultList(); - assertEquals( true, connectionIsOpen.get() ); + assertTrue( connectionIsOpen.get() ); transactionFailureTrigger.set( true ); em.getTransaction().rollback(); fail( "Rollback failure, Exception expected" ); @@ -109,7 +109,7 @@ public void assertConnectionIsReleasedIfRollbackFails() { em.close(); } - assertEquals( false, connectionIsOpen.get(), "The connection was not released" ); + assertFalse( connectionIsOpen.get(), "The connection was not released" ); } private Map basicSettings() { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionRollbackTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionRollbackTest.java index 278106d2e341..711e040dde6e 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionRollbackTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/transaction/TransactionRollbackTest.java @@ -94,7 +94,7 @@ public void checkRollBackTransactionIsExecutedOnceWhenACommitFails(EntityManager } @Entity(name = "Shipment") - public class Shipment { + public static class Shipment { @Id private String id; @@ -138,7 +138,7 @@ public void setState(String state) { } - private class OperationCollectorObserver implements TransactionObserver { + private static class OperationCollectorObserver implements TransactionObserver { int unSuccessfulAfterCompletion; @Override diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/version/JpaSpecVersionValueUpdatingTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/version/JpaSpecVersionValueUpdatingTest.java index 6d6563122b09..ab2277208832 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/version/JpaSpecVersionValueUpdatingTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/version/JpaSpecVersionValueUpdatingTest.java @@ -4,117 +4,101 @@ */ package org.hibernate.orm.test.jpa.version; -import org.junit.Test; - -import org.hibernate.Session; +import org.hibernate.testing.orm.junit.DomainModel; import org.hibernate.testing.orm.junit.JiraKey; -import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; +import org.hibernate.testing.orm.junit.SessionFactory; +import org.hibernate.testing.orm.junit.SessionFactoryScope; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author Steve Ebersole */ @JiraKey( value = "HHH-7138" ) -public class JpaSpecVersionValueUpdatingTest extends BaseCoreFunctionalTestCase { - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { Customer.class, Order.class }; - } +@DomainModel(annotatedClasses = {Customer.class, Order.class}) +@SessionFactory +public class JpaSpecVersionValueUpdatingTest { + + @AfterEach + public void afterEach(SessionFactoryScope scope) { scope.dropData(); } @Test - public void testVersionNotIncrementedOnModificationOfNonOwningCollectionNonCascaded() { - Session session = openSession(); - session.beginTransaction(); - Customer customer = new Customer(); - customer.id = 1L; - session.persist( customer ); - session.getTransaction().commit(); - session.close(); - - long initial = customer.version; - - session = openSession(); - session.beginTransaction(); - customer = session.get( Customer.class, 1L ); - assertEquals( initial, customer.version ); - Order order = new Order(); - order.id = 1L; - order.customer = customer; - customer.orders.add( order ); - session.persist( order ); - session.getTransaction().commit(); - session.close(); - - assertEquals( initial, customer.version ); - - session = openSession(); - session.beginTransaction(); - customer = session.get( Customer.class, 1L ); - assertEquals( initial, customer.version ); - Order order2 = new Order(); - order2.id = 2L; - order2.customer = customer; - customer.orders.add( order2 ); - session.persist( order2 ); - session.getTransaction().commit(); - session.close(); - - assertEquals( initial, customer.version ); - - session = openSession(); - session.beginTransaction(); - customer = session.getReference( Customer.class, 1L ); - assertEquals( initial, customer.version ); - session.remove( customer ); - session.getTransaction().commit(); - session.close(); + public void testVersionNotIncrementedOnModificationOfNonOwningCollectionNonCascaded(SessionFactoryScope scope) { + final Customer initialCustomer = new Customer(); + initialCustomer.id = 1L; + + scope.inTransaction( session -> session.persist( initialCustomer ) ); + + long initialVersion = initialCustomer.version; + + Customer customer = scope.fromTransaction( session -> { + Customer c = session.find( Customer.class, 1L ); + assertEquals( initialVersion, c.version ); + Order order = new Order(); + order.id = 1L; + order.customer = c; + c.orders.add( order ); + session.persist( order ); + return c; + } ); + assertEquals( initialVersion, customer.version ); + + customer = scope.fromTransaction( session -> { + Customer c = session.find( Customer.class, 1L ); + assertEquals( initialVersion, c.version ); + Order order2 = new Order(); + order2.id = 2L; + order2.customer = c; + c.orders.add( order2 ); + session.persist( order2 ); + return c; + } ); + assertEquals( initialVersion, customer.version ); + + scope.inTransaction( session -> { + Customer c = session.getReference( Customer.class, 1L ); + assertEquals( initialVersion, c.version ); + } ); } @Test - public void testVersionNotIncrementedOnModificationOfNonOwningCollectionCascaded() { - Customer customer = new Customer(); - customer.id = 1L; - - Session session = openSession(); - session.beginTransaction(); - session.persist( customer ); - session.getTransaction().commit(); - session.close(); - - long initial = customer.version; - - session = openSession(); - session.beginTransaction(); - customer = (Customer) session.get( Customer.class, 1L ); - assertEquals( initial, customer.version ); - Order order = new Order(); - order.id = 1L; - order.customer = customer; - customer.orders.add( order ); - session.getTransaction().commit(); - session.close(); - - assertEquals( initial, customer.version ); - - session = openSession(); - session.beginTransaction(); - customer = (Customer) session.get( Customer.class, 1L ); - Order order2 = new Order(); - order2.id = 2L; - order2.customer = customer; - customer.orders.add( order2 ); - session.getTransaction().commit(); - session.close(); - - assertEquals( initial, customer.version ); - - session = openSession(); - session.beginTransaction(); - customer = session.getReference( Customer.class, 1L ); - assertEquals( initial, customer.version ); - session.remove( customer ); - session.getTransaction().commit(); - session.close(); + public void testVersionNotIncrementedOnModificationOfNonOwningCollectionCascaded(SessionFactoryScope scope) { + Customer initialCustomer = new Customer(); + initialCustomer.id = 1L; + + scope.inTransaction( session -> session.persist( initialCustomer ) ); + + long initialVersion = initialCustomer.version; + + Customer customer = scope.fromTransaction( session -> { + Customer c = session.find( Customer.class, 1L ); + assertEquals( initialVersion, c.version ); + Order order = new Order(); + order.id = 1L; + order.customer = c; + c.orders.add( order ); + return c; + } + ); + assertEquals( initialVersion, customer.version ); + + customer = scope.fromTransaction( session -> { + Customer c = session.find( Customer.class, 1L ); + Order order2 = new Order(); + order2.id = 2L; + order2.customer = c; + c.orders.add( order2 ); + return c; + } + ); + assertEquals( initialVersion, customer.version ); + + scope.inTransaction( session -> { + Customer c = session.getReference( Customer.class, 1L ); + assertEquals( initialVersion, c.version ); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/xml/versions/JpaXsdVersionsTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/xml/versions/JpaXsdVersionsTest.java index 367c09bdf8d5..576ba3d89b43 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/xml/versions/JpaXsdVersionsTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/xml/versions/JpaXsdVersionsTest.java @@ -4,12 +4,6 @@ */ package org.hibernate.orm.test.jpa.xml.versions; -import java.net.URL; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.PersistenceException; import jakarta.persistence.SharedCacheMode; @@ -17,17 +11,24 @@ import jakarta.persistence.spi.ClassTransformer; import jakarta.persistence.spi.PersistenceUnitInfo; import jakarta.persistence.spi.PersistenceUnitTransactionType; -import javax.sql.DataSource; import org.hibernate.AnnotationException; import org.hibernate.InvalidMappingException; import org.hibernate.jpa.HibernatePersistenceProvider; import org.hibernate.orm.test.jpa.pack.defaultpar.Lighter; import org.hibernate.orm.test.jpa.pack.defaultpar_1_0.Lighter1; - import org.hibernate.testing.util.ServiceRegistryUtil; -import org.junit.Assert; -import org.junit.Test; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import javax.sql.DataSource; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; /** * "smoke" tests for JEE bootstrapping of HEM via a {@link PersistenceUnitInfo} @@ -87,7 +88,7 @@ public void testInvalidOrm1() { .addMappingFileName( "org/hibernate/orm/test/jpa/xml/versions/invalid-orm-1_0.xml" ); HibernatePersistenceProvider hp = new HibernatePersistenceProvider(); try ( EntityManagerFactory emf = hp.createContainerEntityManagerFactory( pui, getDefaultPuConfig() ) ) { - Assert.fail("expecting 'invalid content' error"); + Assertions.fail("expecting 'invalid content' error"); } catch (InvalidMappingException | AnnotationException expected) { // expected condition From 60bb0ec1573413cd808e679ac0ac873f57255af4 Mon Sep 17 00:00:00 2001 From: Jan Schatteman Date: Mon, 27 Oct 2025 23:01:42 +0100 Subject: [PATCH 4/6] HHH-19846 - Drop JUnit 4 usage: org.hibernate.orm.test.jpa.criteria - WIP Signed-off-by: Jan Schatteman --- .../alias/CriteriaMultiselectAliasTest.java | 52 +- .../criteria/basic/AggregationResultTest.java | 160 +++--- .../basic/BasicCriteriaUsageTest.java | 211 ++++---- .../test/jpa/criteria/basic/ConcatTest.java | 81 +-- ...est.java => CriteriaAsExpressionTest.java} | 9 +- .../jpa/criteria/basic/ExpressionsTest.java | 233 ++++----- .../jpa/criteria/basic/ListIndexTest.java | 103 ++-- .../jpa/criteria/basic/PredicateTest.java | 460 +++++++++--------- .../ComponentInWhereClauseTest.java | 2 +- .../enumcollection/EnumIsMemberTest.java | 76 ++- .../CriteriaToScrollableResultsFetchTest.java | 195 +++----- .../idclass/IdClassPredicateTest.java | 285 +++++------ .../criteria/paths/AbstractPathImplTest.java | 150 +++--- .../jpa/criteria/paths/FetchAndJoinTest.java | 35 +- .../paths/PluralAttributeExpressionsTest.java | 78 ++- .../subquery/CorrelatedSubqueryTest.java | 183 +++---- .../subquery/UncorrelatedSubqueryTest.java | 158 +++--- .../jpa/criteria/tuple/TupleCriteriaTest.java | 375 +++++++------- .../TupleQueryRetrievePrimitiveTest.java | 73 ++- 19 files changed, 1318 insertions(+), 1601 deletions(-) rename hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/{CiteriaAsExpressionTest.java => CriteriaAsExpressionTest.java} (97%) diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/alias/CriteriaMultiselectAliasTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/alias/CriteriaMultiselectAliasTest.java index a92e90d2cb73..c4956afa5459 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/alias/CriteriaMultiselectAliasTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/alias/CriteriaMultiselectAliasTest.java @@ -4,51 +4,51 @@ */ package org.hibernate.orm.test.jpa.criteria.alias; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertEquals; - -import java.util.List; - import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; import org.hibernate.query.Query; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; import org.hibernate.transform.Transformers; -import org.junit.Before; -import org.junit.Test; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author Vlad Mihalcea */ -public class CriteriaMultiselectAliasTest extends BaseEntityManagerFunctionalTestCase { - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { - Book.class - }; - } +@Jpa(annotatedClasses = {CriteriaMultiselectAliasTest.Book.class}) +public class CriteriaMultiselectAliasTest { - @Before - public void init() { - doInJPA( this::entityManagerFactory, entityManager -> { + @BeforeEach + public void init(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Book book = new Book(); book.id = 1; book.name = bookName(); - entityManager.persist( book ); } ); } + @AfterEach + public void cleanup(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); + } + @Test @JiraKey(value = "HHH-13140") - public void testAlias() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testAlias(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); final CriteriaQuery query = cb.createQuery( Object[].class ); @@ -73,8 +73,8 @@ public void testAlias() { @Test @JiraKey(value = "HHH-13192") - public void testNoAliasInWhereClause() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNoAliasInWhereClause(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); final CriteriaQuery query = cb.createQuery( Object[].class ); @@ -101,8 +101,8 @@ public void testNoAliasInWhereClause() { @Test @JiraKey(value = "HHH-13192") - public void testNoAliasInWhereClauseSimplified() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNoAliasInWhereClauseSimplified(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery criteriaQuery = cb.createQuery(); Root root = criteriaQuery.from( Book.class ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/AggregationResultTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/AggregationResultTest.java index ab3d30af98e0..9f46587f6cd1 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/AggregationResultTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/AggregationResultTest.java @@ -6,15 +6,16 @@ import java.math.BigDecimal; import java.math.BigInteger; -import jakarta.persistence.EntityManager; + import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; import org.hibernate.orm.test.jpa.metamodel.Product; import org.hibernate.orm.test.jpa.metamodel.Product_; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -24,134 +25,117 @@ /** * @author Steve Ebersole */ -public class AggregationResultTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = {Product.class}) +public class AggregationResultTest { private CriteriaBuilder builder; @BeforeEach - public void createTestData() { - builder = entityManagerFactory().getCriteriaBuilder(); - - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - Product product = new Product(); - product.setId( "product1" ); - product.setPrice( 1.23d ); - product.setQuantity( 1000 ); - product.setPartNumber( ( (long) Integer.MAX_VALUE ) + 1 ); - product.setRating( 1.999f ); - product.setSomeBigInteger( BigInteger.valueOf( 987654321 ) ); - product.setSomeBigDecimal( BigDecimal.valueOf( 987654.32 ) ); - em.persist( product ); - em.getTransaction().commit(); - em.close(); + public void createTestData(EntityManagerFactoryScope scope) { + builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + + scope.inTransaction( entityManager -> { + Product product = new Product(); + product.setId( "product1" ); + product.setPrice( 1.23d ); + product.setQuantity( 1000 ); + product.setPartNumber( ((long) Integer.MAX_VALUE) + 1 ); + product.setRating( 1.999f ); + product.setSomeBigInteger( BigInteger.valueOf( 987654321 ) ); + product.setSomeBigDecimal( BigDecimal.valueOf( 987654.32 ) ); + entityManager.persist( product ); + } ); } @AfterEach - public void cleanUpTestData() throws Exception { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete Product" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + public void cleanUpTestData(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } /** * Sum of Longs should return a Long */ @Test - public void testSumOfLongs() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery criteria = builder.createQuery( Long.class ); - Root productRoot = criteria.from( Product.class ); - criteria.select( builder.sum( productRoot.get( Product_.partNumber ) ) ); - Object sumResult = em.createQuery( criteria ).getSingleResult(); - assertReturnType( Long.class, sumResult ); - em.getTransaction().commit(); - em.close(); + public void testSumOfLongs(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( Long.class ); + Root productRoot = criteria.from( Product.class ); + criteria.select( builder.sum( productRoot.get( Product_.partNumber ) ) ); + Object sumResult = entityManager.createQuery( criteria ).getSingleResult(); + assertReturnType( Long.class, sumResult ); + } ); } /** - * Sum of Integers should return an Integer; note that this is distinctly different than JPAQL + * Sum of Integers should return an Integer; note that this is distinctly different from JPAQL */ @Test - public void testSumOfIntegers() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery criteria = builder.createQuery( Integer.class ); - Root productRoot = criteria.from( Product.class ); - criteria.select( builder.sum( productRoot.get( Product_.quantity ) ) ); - Object sumResult = em.createQuery( criteria ).getSingleResult(); - assertReturnType( Integer.class, sumResult ); - em.getTransaction().commit(); - em.close(); + public void testSumOfIntegers(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( Integer.class ); + Root productRoot = criteria.from( Product.class ); + criteria.select( builder.sum( productRoot.get( Product_.quantity ) ) ); + Object sumResult = entityManager.createQuery( criteria ).getSingleResult(); + assertReturnType( Integer.class, sumResult ); + } ); } /** * Sum of Doubles should return a Double */ @Test - public void testSumOfDoubles() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery criteria = builder.createQuery( Double.class ); - Root productRoot = criteria.from( Product.class ); - criteria.select( builder.sum( productRoot.get( Product_.price ) ) ); - Object sumResult = em.createQuery( criteria ).getSingleResult(); - assertReturnType( Double.class, sumResult ); - em.getTransaction().commit(); - em.close(); + public void testSumOfDoubles(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( Double.class ); + Root productRoot = criteria.from( Product.class ); + criteria.select( builder.sum( productRoot.get( Product_.price ) ) ); + Object sumResult = entityManager.createQuery( criteria ).getSingleResult(); + assertReturnType( Double.class, sumResult ); + } ); } /** - * Sum of Floats should return a Float; note that this is distinctly different than JPAQL + * Sum of Floats should return a Float; note that this is distinctly different from JPAQL */ @Test - public void testSumOfFloats() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery criteria = builder.createQuery( Float.class ); - Root productRoot = criteria.from( Product.class ); - criteria.select( builder.sum( productRoot.get( Product_.rating ) ) ); - Object sumResult = em.createQuery( criteria ).getSingleResult(); - assertReturnType( Float.class, sumResult ); - em.getTransaction().commit(); - em.close(); + public void testSumOfFloats(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( Float.class ); + Root productRoot = criteria.from( Product.class ); + criteria.select( builder.sum( productRoot.get( Product_.rating ) ) ); + Object sumResult = entityManager.createQuery( criteria ).getSingleResult(); + assertReturnType( Float.class, sumResult ); + } ); } /** * Sum of BigInteger should return a BigInteger */ @Test - public void testSumOfBigIntegers() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery criteria = builder.createQuery( BigInteger.class ); - Root productRoot = criteria.from( Product.class ); - criteria.select( builder.sum( productRoot.get( Product_.someBigInteger ) ) ); - Object sumResult = em.createQuery( criteria ).getSingleResult(); - assertReturnType( BigInteger.class, sumResult ); - em.getTransaction().commit(); - em.close(); + public void testSumOfBigIntegers(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( BigInteger.class ); + Root productRoot = criteria.from( Product.class ); + criteria.select( builder.sum( productRoot.get( Product_.someBigInteger ) ) ); + Object sumResult = entityManager.createQuery( criteria ).getSingleResult(); + assertReturnType( BigInteger.class, sumResult ); + } ); } /** * Sum of BigDecimal should return a BigDecimal */ @Test - public void testSumOfBigDecimals() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery criteria = builder.createQuery( BigDecimal.class ); - Root productRoot = criteria.from( Product.class ); - criteria.select( builder.sum( productRoot.get( Product_.someBigDecimal ) ) ); - Object sumResult = em.createQuery( criteria ).getSingleResult(); - assertReturnType( BigDecimal.class, sumResult ); - em.getTransaction().commit(); - em.close(); + public void testSumOfBigDecimals(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( BigDecimal.class ); + Root productRoot = criteria.from( Product.class ); + criteria.select( builder.sum( productRoot.get( Product_.someBigDecimal ) ) ); + Object sumResult = entityManager.createQuery( criteria ).getSingleResult(); + assertReturnType( BigDecimal.class, sumResult ); + } ); } - private void assertReturnType(Class expectedType, Object value) { + private void assertReturnType(Class expectedType, Object value) { if ( value != null && ! expectedType.isInstance( value ) ) { fail( "Result value was not of expected type: expected [" + expectedType.getName() diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/BasicCriteriaUsageTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/BasicCriteriaUsageTest.java index b9d419e36c2f..697b24311c7a 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/BasicCriteriaUsageTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/BasicCriteriaUsageTest.java @@ -4,17 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria.basic; -import java.math.BigDecimal; -import java.time.Instant; -import java.util.Date; -import java.util.List; - -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - -import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; - -import jakarta.persistence.EntityManager; import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; @@ -22,147 +11,149 @@ import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; import jakarta.persistence.metamodel.SingularAttribute; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.time.Instant; +import java.util.Date; +import java.util.List; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; /** * @author Steve Ebersole */ -public class BasicCriteriaUsageTest extends BaseEntityManagerFunctionalTestCase { +@Jpa(annotatedClasses = {Wall.class, Payment.class}) +public class BasicCriteriaUsageTest { - @Override - public Class[] getAnnotatedClasses() { - return new Class[] { Wall.class, Payment.class }; + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testParameterCollection() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery criteria = em.getCriteriaBuilder().createQuery( Wall.class ); - Root from = criteria.from( Wall.class ); - ParameterExpression param = em.getCriteriaBuilder().parameter( String.class ); - SingularAttribute colorAttribute = em.getMetamodel().entity( Wall.class ).getDeclaredSingularAttribute( "color" ); - assertNotNull( "metamodel returned null singular attribute", colorAttribute ); - Predicate predicate = em.getCriteriaBuilder().equal( from.get( colorAttribute ), param ); - criteria.where( predicate ); - assertEquals( 1, criteria.getParameters().size() ); - em.getTransaction().commit(); - em.close(); + public void testParameterCollection(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = entityManager.getCriteriaBuilder().createQuery( Wall.class ); + Root from = criteria.from( Wall.class ); + ParameterExpression param = entityManager.getCriteriaBuilder().parameter( String.class ); + SingularAttribute colorAttribute = entityManager.getMetamodel().entity( Wall.class ) + .getDeclaredSingularAttribute( "color" ); + assertNotNull( colorAttribute, "metamodel returned null singular attribute" ); + Predicate predicate = entityManager.getCriteriaBuilder().equal( from.get( colorAttribute ), param ); + criteria.where( predicate ); + assertEquals( 1, criteria.getParameters().size() ); + } ); } @Test - public void testTrivialCompilation() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery criteria = em.getCriteriaBuilder().createQuery( Wall.class ); - criteria.from( Wall.class ); - em.createQuery( criteria ).getResultList(); - em.getTransaction().commit(); - em.close(); + public void testTrivialCompilation(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = entityManager.getCriteriaBuilder().createQuery( Wall.class ); + criteria.from( Wall.class ); + entityManager.createQuery( criteria ).getResultList(); + } ); } @Test @JiraKey(value = "HHH-8283") - public void testDateCompositeCustomType() { + public void testDateCompositeCustomType(EntityManagerFactoryScope scope) { final Date date = Date.from( Instant.now() ); final Payment payment = new Payment(); payment.setAmount( new BigDecimal( 1000 ) ); payment.setDate( date ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( payment ); + scope.inTransaction( entityManager -> { + entityManager.persist( payment ); - CriteriaQuery criteria = em.getCriteriaBuilder().createQuery( Payment.class ); - Root rp = criteria.from( Payment.class ); - Predicate predicate = em.getCriteriaBuilder().equal( rp.get( Payment_.date ), date ); - criteria.where( predicate ); + CriteriaQuery criteria = entityManager.getCriteriaBuilder().createQuery( Payment.class ); + Root rp = criteria.from( Payment.class ); + Predicate predicate = entityManager.getCriteriaBuilder().equal( rp.get( Payment_.date ), date ); + criteria.where( predicate ); - TypedQuery q = em.createQuery( criteria ); - List payments = q.getResultList(); + TypedQuery q = entityManager.createQuery( criteria ); + List payments = q.getResultList(); - assertEquals( 1, payments.size() ); + assertEquals( 1, payments.size() ); - em.getTransaction().commit(); - em.close(); + } ); } @Test @JiraKey(value = "HHH-8373") - public void testFunctionCriteria() { + public void testFunctionCriteria(EntityManagerFactoryScope scope) { Wall wall = new Wall(); wall.setColor( "yellow" ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( wall ); + scope.inTransaction( entityManager -> { + entityManager.persist( wall ); - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery query = cb.createQuery( Wall.class ); - Root root = query.from( Wall.class ); + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery query = cb.createQuery( Wall.class ); + Root root = query.from( Wall.class ); - query.select( root ).where( cb.equal( root.get( "color" ), cb.lower( cb.literal( "YELLOW" ) ) ) ); + query.select( root ).where( cb.equal( root.get( "color" ), cb.lower( cb.literal( "YELLOW" ) ) ) ); - Wall resultItem = em.createQuery( query ).getSingleResult(); - assertNotNull( resultItem ); + Wall resultItem = entityManager.createQuery( query ).getSingleResult(); + assertNotNull( resultItem ); - em.getTransaction().commit(); - em.close(); + } ); } @Test - @JiraKey( value = "HHH-8914" ) - public void testDoubleNegation() { + @JiraKey(value = "HHH-8914") + public void testDoubleNegation(EntityManagerFactoryScope scope) { Wall wall1 = new Wall(); wall1.setColor( "yellow" ); Wall wall2 = new Wall(); wall2.setColor( null ); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( wall1 ); - em.persist( wall2 ); - em.getTransaction().commit(); - em.clear(); - - em.getTransaction().begin(); - - // Although the examples are simplified and the usages appear pointless, - // double negatives can occur in some dynamic applications (regardless - // if it results from bad design or not). Ensure we handle them as expected. - - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery query = cb.createQuery( Wall.class ); - Root root = query.from( Wall.class ); - query.select( root ).where( - cb.not( - cb.isNotNull( root.get( "color" ) ) ) ); - Wall result = em.createQuery( query ).getSingleResult(); - assertNotNull( result ); - assertEquals( null, result.getColor() ); - - query = cb.createQuery( Wall.class ); - root = query.from( Wall.class ); - query.select( root ).where( - cb.not( - cb.not( - cb.isNull( root.get( "color" ) ) ) ) ); - result = em.createQuery( query ).getSingleResult(); - assertNotNull( result ); - assertEquals( null, result.getColor() ); - - query = cb.createQuery( Wall.class ); - root = query.from( Wall.class ); - query.select( root ).where( - cb.not( - cb.not( - cb.isNotNull( root.get( "color" ) ) ) ) ); - result = em.createQuery( query ).getSingleResult(); - assertNotNull( result ); - assertEquals( "yellow", result.getColor() ); - - em.getTransaction().commit(); - em.close(); + scope.inTransaction( entityManager -> { + entityManager.persist( wall1 ); + entityManager.persist( wall2 ); + } ); + + scope.inTransaction( entityManager -> { + + // Although the examples are simplified and the usages appear pointless, + // double negatives can occur in some dynamic applications (regardless + // if it results from bad design or not). Ensure we handle them as expected. + + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery query = cb.createQuery( Wall.class ); + Root root = query.from( Wall.class ); + query.select( root ).where( + cb.not( + cb.isNotNull( root.get( "color" ) ) ) ); + Wall result = entityManager.createQuery( query ).getSingleResult(); + assertNotNull( result ); + assertNull( result.getColor() ); + + query = cb.createQuery( Wall.class ); + root = query.from( Wall.class ); + query.select( root ).where( + cb.not( + cb.not( + cb.isNull( root.get( "color" ) ) ) ) ); + result = entityManager.createQuery( query ).getSingleResult(); + assertNotNull( result ); + assertNull( result.getColor() ); + + query = cb.createQuery( Wall.class ); + root = query.from( Wall.class ); + query.select( root ).where( + cb.not( + cb.not( + cb.isNotNull( root.get( "color" ) ) ) ) ); + result = entityManager.createQuery( query ).getSingleResult(); + assertNotNull( result ); + assertEquals( "yellow", result.getColor() ); + + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ConcatTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ConcatTest.java index 40e03396d68c..1c0c36cfda30 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ConcatTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ConcatTest.java @@ -5,7 +5,6 @@ package org.hibernate.orm.test.jpa.criteria.basic; import jakarta.persistence.Entity; -import jakarta.persistence.EntityManager; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.Table; @@ -15,10 +14,11 @@ import java.io.Serializable; import java.util.List; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - -import org.junit.Before; -import org.junit.Test; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.hibernate.testing.orm.junit.JiraKey; @@ -29,39 +29,26 @@ * @author Andrea Boriero */ @JiraKey(value = "HHH-10843") -public class ConcatTest extends BaseEntityManagerFunctionalTestCase { - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] {TestEntity.class}; - } +@Jpa(annotatedClasses = {ConcatTest.TestEntity.class}) +public class ConcatTest { - @Before - public void setUp() { - EntityManager entityManager = getOrCreateEntityManager(); - entityManager.getTransaction().begin(); - try { + @BeforeEach + public void setUp(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { TestEntity testEntity = new TestEntity(); testEntity.setName( "test_1" ); entityManager.persist( testEntity ); - entityManager.getTransaction().commit(); - } - catch (Exception e) { - if ( entityManager.getTransaction().isActive() ) { - entityManager.getTransaction().rollback(); - } - throw e; - } - finally { - entityManager.close(); - } + } ); + } + + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testSelectCaseWithConcat() { - EntityManager entityManager = getOrCreateEntityManager(); - entityManager.getTransaction().begin(); - try { + public void testSelectCaseWithConcat(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery( Object[].class ); Root testEntity = query.from( TestEntity.class ); @@ -77,44 +64,22 @@ public void testSelectCaseWithConcat() { assertThat( results.size(), is( 1 ) ); assertThat( results.get( 0 )[0], is( "test_1" ) ); assertThat( results.get( 0 )[1], is( ".Test" ) ); - entityManager.getTransaction().commit(); - } - catch (Exception e) { - if ( entityManager.getTransaction().isActive() ) { - entityManager.getTransaction().rollback(); - } - throw e; - } - finally { - entityManager.close(); - } + } ); } @Test - public void testConcat() { - EntityManager entityManager = getOrCreateEntityManager(); - entityManager.getTransaction().begin(); - try { + public void testConcat(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery(); Root testEntity = query.from( TestEntity.class ); query.select( testEntity ).where( cb.equal( testEntity.get( "name" ), cb.concat( "test", cb.literal( "_1" ) ) ) ); - final List results = entityManager.createQuery( query ).getResultList(); - entityManager.getTransaction().commit(); + final List results = entityManager.createQuery( query ).getResultList(); assertThat( results.size(), is( 1 ) ); - } - catch (Exception e) { - if ( entityManager.getTransaction().isActive() ) { - entityManager.getTransaction().rollback(); - } - throw e; - } - finally { - entityManager.close(); - } + } ); } @Entity(name = "TestEntity") diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/CiteriaAsExpressionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/CriteriaAsExpressionTest.java similarity index 97% rename from hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/CiteriaAsExpressionTest.java rename to hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/CriteriaAsExpressionTest.java index 90406f08ef91..8f4beb4663f2 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/CiteriaAsExpressionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/CriteriaAsExpressionTest.java @@ -38,11 +38,11 @@ @Jpa(annotatedClasses = { Product.class, ShelfLife.class, - CiteriaAsExpressionTest.TestEntity.class + CriteriaAsExpressionTest.TestEntity.class }, useCollectingStatementInspector = true ) -public class CiteriaAsExpressionTest { +public class CriteriaAsExpressionTest { private static final int QUANTITY = 2; private static final String NAME = "a"; private static final Integer NAME_CONVERTED_VALUE = 1; @@ -98,7 +98,7 @@ public void testAsToString(EntityManagerFactoryScope scope) { @Test @JiraKey("HHH-15713") - public void testAsIntegerToIntegreDoesNotCreateACast(EntityManagerFactoryScope scope) { + public void testAsIntegerToIntegerDoesNotCreateACast(EntityManagerFactoryScope scope) { SQLStatementInspector statementInspector = (SQLStatementInspector) scope.getStatementInspector(); statementInspector.clear(); scope.inTransaction( @@ -175,8 +175,7 @@ private static String getExecutedQuery(SQLStatementInspector statementInspector) List sqlQueries = statementInspector.getSqlQueries(); assertThat( sqlQueries.size() ).isEqualTo( 1 ); - String executedQuery = sqlQueries.get( 0 ); - return executedQuery; + return sqlQueries.get( 0 ); } @Entity(name = "TestEntity") diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ExpressionsTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ExpressionsTest.java index 1c9b7d3cd5a5..74fe09fbefa5 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ExpressionsTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ExpressionsTest.java @@ -4,50 +4,50 @@ */ package org.hibernate.orm.test.jpa.criteria.basic; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.time.Duration; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Collections; -import java.util.List; +import jakarta.persistence.Tuple; +import jakarta.persistence.TypedQuery; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Expression; +import jakarta.persistence.criteria.ParameterExpression; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; import org.hibernate.Session; -import org.hibernate.SessionFactory; import org.hibernate.community.dialect.AltibaseDialect; -import org.hibernate.dialect.DB2Dialect; import org.hibernate.community.dialect.DerbyDialect; +import org.hibernate.community.dialect.GaussDBDialect; +import org.hibernate.dialect.DB2Dialect; import org.hibernate.dialect.PostgresPlusDialect; import org.hibernate.dialect.SybaseDialect; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; +import org.hibernate.orm.test.jpa.metamodel.Address; import org.hibernate.orm.test.jpa.metamodel.Phone; import org.hibernate.orm.test.jpa.metamodel.Product; import org.hibernate.orm.test.jpa.metamodel.Product_; import org.hibernate.query.Query; +import org.hibernate.query.common.TemporalUnit; import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.hibernate.query.criteria.JpaCriteriaQuery; import org.hibernate.query.criteria.JpaDerivedRoot; import org.hibernate.query.criteria.JpaSubQuery; -import org.hibernate.query.common.TemporalUnit; - -import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.Jira; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; import org.hibernate.testing.orm.junit.SkipForDialect; -import org.hibernate.community.dialect.GaussDBDialect; + import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import jakarta.persistence.Tuple; -import jakarta.persistence.TypedQuery; -import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.CriteriaQuery; -import jakarta.persistence.criteria.Expression; -import jakarta.persistence.criteria.ParameterExpression; -import jakarta.persistence.criteria.Predicate; -import jakarta.persistence.criteria.Root; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.List; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; import static org.junit.jupiter.api.Assertions.assertEquals; /** @@ -55,16 +55,15 @@ * * @author Steve Ebersole */ -public class ExpressionsTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = {Product.class, Phone.class, Address.class}) +public class ExpressionsTest { private CriteriaBuilder builder; @BeforeEach - public void prepareTestData() { - builder = entityManagerFactory().getCriteriaBuilder(); + public void prepareTestData(EntityManagerFactoryScope scope) { + builder = scope.getEntityManagerFactory().getCriteriaBuilder(); - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { Product product = new Product(); product.setId( "product1" ); product.setPrice( 1.23d ); @@ -79,15 +78,13 @@ public void prepareTestData() { } @AfterEach - public void cleanupTestData() { - entityManagerFactory().unwrap(SessionFactory.class).getSchemaManager().truncate(); + public void cleanupTestData(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testEmptyConjunction() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testEmptyConjunction(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); criteria.from( Product.class ); criteria.where( builder.and() ); @@ -99,17 +96,15 @@ public void testEmptyConjunction() { @Test @JiraKey( value = "HHH-15452") - public void testGetConjunctionExpressionsAndAddPredicate(){ - inTransaction( - entityManager -> { - CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + public void testGetConjunctionExpressionsAndAddPredicate(EntityManagerFactoryScope scope){ + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(Product.class); - Root rootClaseGrid = criteria.from(Product.class); + Root root = criteria.from(Product.class); - Predicate conjuncion = builder.conjunction(); - Predicate expr = builder.equal(rootClaseGrid.get("id"), "NON existing id"); + Predicate conjunction = builder.conjunction(); + Predicate expr = builder.equal(root.get("id"), "NON existing id"); // Modifications to the list do not affect the query - List> expressions = conjuncion.getExpressions(); + List> expressions = conjunction.getExpressions(); expressions.add( expr); List result = entityManager.createQuery( criteria ).getResultList(); @@ -120,10 +115,8 @@ public void testGetConjunctionExpressionsAndAddPredicate(){ @Test @JiraKey(value = "HHH-6876") - public void testEmptyInList() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testEmptyInList(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); Root from = criteria.from( Product.class ); criteria.where( from.get( Product_.partNumber ).in() ); // empty IN list @@ -134,10 +127,8 @@ public void testEmptyInList() { } @Test - public void testEmptyConjunctionIsTrue() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testEmptyConjunctionIsTrue(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); criteria.from( Product.class ); criteria.where( builder.isTrue( builder.and() ) ); @@ -148,10 +139,8 @@ public void testEmptyConjunctionIsTrue() { } @Test - public void testEmptyConjunctionIsFalse() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testEmptyConjunctionIsFalse(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); criteria.from( Product.class ); criteria.where( builder.isFalse( builder.and() ) ); @@ -162,10 +151,8 @@ public void testEmptyConjunctionIsFalse() { } @Test - public void testEmptyDisjunction() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testEmptyDisjunction(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); criteria.from( Product.class ); criteria.where( builder.disjunction() ); @@ -176,10 +163,8 @@ public void testEmptyDisjunction() { } @Test - public void testEmptyDisjunctionIsTrue() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testEmptyDisjunctionIsTrue(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); criteria.from( Product.class ); criteria.where( builder.isTrue( builder.disjunction() ) ); @@ -190,10 +175,8 @@ public void testEmptyDisjunctionIsTrue() { } @Test - public void testEmptyDisjunctionIsFalse() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testEmptyDisjunctionIsFalse(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); criteria.from( Product.class ); criteria.where( builder.isFalse( builder.disjunction() ) ); @@ -204,10 +187,8 @@ public void testEmptyDisjunctionIsFalse() { } @Test - public void testDiff() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testDiff(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Integer.class ); criteria.from( Product.class ); criteria.select( builder.diff( builder.literal( 5 ), builder.literal( 2 ) ) ); @@ -218,10 +199,8 @@ public void testDiff() { } @Test - public void testDiffWithQuotient() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testDiffWithQuotient(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Number.class ); criteria.from( Product.class ); criteria.select( @@ -240,10 +219,8 @@ public void testDiffWithQuotient() { } @Test - public void testSumWithQuotient() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testSumWithQuotient(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Number.class ); criteria.from( Product.class ); criteria.select( @@ -263,10 +240,8 @@ public void testSumWithQuotient() { @Test @Jira( "https://hibernate.atlassian.net/browse/HHH-17223" ) - public void testSumWithCoalesce() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testSumWithCoalesce(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final CriteriaQuery criteria = builder.createQuery( Integer.class ); final Root root = criteria.from( Product.class ); criteria.select( @@ -282,10 +257,8 @@ public void testSumWithCoalesce() { @Test @Jira( "https://hibernate.atlassian.net/browse/HHH-17260" ) - public void testSumWithSubqueryPath() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testSumWithSubqueryPath(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final HibernateCriteriaBuilder cb = entityManager.unwrap( Session.class ).getCriteriaBuilder(); final JpaCriteriaQuery criteria = cb.createQuery( Integer.class ); final JpaSubQuery subquery = criteria.subquery( Tuple.class ); @@ -306,20 +279,16 @@ public void testSumWithSubqueryPath() { @SkipForDialect(dialectClass = PostgresPlusDialect.class, reason = "does not support extract(epoch)") @SkipForDialect(dialectClass = AltibaseDialect.class, reason = "datediff overflow limits") @SkipForDialect(dialectClass = GaussDBDialect.class, reason = "type:resolved.date multi overflows") - public void testDateTimeOperations() { + public void testDateTimeOperations(EntityManagerFactoryScope scope) { HibernateCriteriaBuilder builder = (HibernateCriteriaBuilder) this.builder; - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(LocalDate.class); criteria.select( builder.addDuration( builder.localDate(), builder.duration(2, TemporalUnit.YEAR) ) ); entityManager.createQuery(criteria).getSingleResult(); } ); - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(LocalDate.class); criteria.select( builder.addDuration( // had to call literal() here because parameter-based binding caused error from @@ -339,34 +308,26 @@ public void testDateTimeOperations() { // entityManager.createQuery(criteria).getSingleResult(); // } // ); - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(LocalDateTime.class); criteria.select( builder.subtractDuration( builder.localDateTime(), Duration.ofMinutes(30) ) ); entityManager.createQuery(criteria).getSingleResult(); } ); - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(Duration.class); criteria.select( builder.durationScaled( 5, builder.duration(2, TemporalUnit.HOUR ) ) ); assertEquals( Duration.ofHours(10), entityManager.createQuery(criteria).getSingleResult() ); } ); - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(Duration.class); criteria.select( builder.durationSum( builder.duration(30, TemporalUnit.MINUTE ), builder.duration(2, TemporalUnit.HOUR) ) ); assertEquals( Duration.ofMinutes(150), entityManager.createQuery(criteria).getSingleResult() ); } ); - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(Long.class); criteria.select( builder.durationByUnit( TemporalUnit.SECOND, builder.durationSum( builder.duration(30, TemporalUnit.MINUTE), @@ -379,20 +340,16 @@ public void testDateTimeOperations() { @Test @SkipForDialect(dialectClass = SybaseDialect.class, matchSubTypes = true, reason = "numeric overflows") @SkipForDialect(dialectClass = PostgresPlusDialect.class, reason = "does not support extract(epoch)") - void testDurationBetween() { + void testDurationBetween(EntityManagerFactoryScope scope) { HibernateCriteriaBuilder builder = (HibernateCriteriaBuilder) this.builder; - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(Duration.class); criteria.select( builder.durationBetween( builder.localDate(), LocalDate.of(2000,1, 1) ) ); entityManager.createQuery(criteria).getSingleResult(); } ); - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(Duration.class); criteria.select( builder.durationBetween( builder.localDate(), builder.subtractDuration( builder.localDate(), @@ -400,9 +357,7 @@ void testDurationBetween() { assertEquals( Duration.ofDays(2), entityManager.createQuery(criteria).getSingleResult() ); } ); - doInJPA( - this::entityManagerFactory, - entityManager -> { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery(Duration.class); criteria.select( builder.durationBetween( builder.localDateTime(), builder.subtractDuration( builder.localDateTime(), @@ -418,10 +373,8 @@ void testDurationBetween() { "Fixing this would require a custom SqmToSqlAstConverter that creates a special JdbcParameter " + "that is always rendered as literal. Since numeric literal + parameter arithmetic is rare, we skip this for now.") @SkipForDialect(dialectClass = DB2Dialect.class, reason = "Same reason as for Derby") - public void testQuotientAndMultiply() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testQuotientAndMultiply(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Number.class ); criteria.from( Product.class ); criteria.select( @@ -452,16 +405,14 @@ public void testQuotientAndMultiply() { } @Test - public void testParameterReuse() { - doInJPA( - this::entityManagerFactory, - entityManager -> { - CriteriaQuery criteria = entityManager.getCriteriaBuilder().createQuery( Product.class ); + public void testParameterReuse(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( Product.class ); Root from = criteria.from( Product.class ); - ParameterExpression param = entityManager.getCriteriaBuilder().parameter( String.class ); - Predicate predicate = entityManager.getCriteriaBuilder().equal( from.get( Product_.id ), param ); - Predicate predicate2 = entityManager.getCriteriaBuilder().equal( from.get( Product_.name ), param ); - criteria.where( entityManager.getCriteriaBuilder().or( predicate, predicate2 ) ); + ParameterExpression param = builder.parameter( String.class ); + Predicate predicate = builder.equal( from.get( Product_.id ), param ); + Predicate predicate2 = builder.equal( from.get( Product_.name ), param ); + criteria.where( builder.or( predicate, predicate2 ) ); assertEquals( 1, criteria.getParameters().size() ); TypedQuery query = entityManager.createQuery( criteria ); int hqlParamCount = countGeneratedParameters( query.unwrap( Query.class ) ); @@ -476,10 +427,8 @@ private int countGeneratedParameters(Query query) { } @Test - public void testInExplicitTupleList() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testInExplicitTupleList(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); Root from = criteria.from( Product.class ); criteria.where( from.get( Product_.partNumber ) @@ -491,10 +440,8 @@ public void testInExplicitTupleList() { } @Test - public void testInExplicitTupleListVarargs() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testInExplicitTupleListVarargs(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); Root from = criteria.from( Product.class ); criteria.where( from.get( Product_.partNumber ).in( ( (long) Integer.MAX_VALUE ) + 1 ) ); @@ -505,10 +452,8 @@ public void testInExplicitTupleListVarargs() { } @Test - public void testInExpressionVarargs() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testInExpressionVarargs(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Product.class ); Root from = criteria.from( Product.class ); criteria.where( from.get( Product_.partNumber ).in( from.get( Product_.partNumber ) ) ); @@ -519,10 +464,8 @@ public void testInExpressionVarargs() { } @Test - public void testJoinedElementCollectionValuesInTupleList() { - doInJPA( - this::entityManagerFactory, - entityManager -> { + public void testJoinedElementCollectionValuesInTupleList(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = builder.createQuery( Phone.class ); Root from = criteria.from( Phone.class ); criteria.where( diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ListIndexTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ListIndexTest.java index 0635d455f083..b9daa44e4773 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ListIndexTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/ListIndexTest.java @@ -6,18 +6,18 @@ import java.util.List; -import jakarta.persistence.EntityManager; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.ListJoin; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; import org.hibernate.orm.test.jpa.metamodel.Address; import org.hibernate.orm.test.jpa.metamodel.Address_; import org.hibernate.orm.test.jpa.metamodel.Phone; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; @@ -29,64 +29,57 @@ * * @author Brett Meyer */ -public class ListIndexTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = {Phone.class, Address.class}) +public class ListIndexTest { @AfterEach - public void cleanupTestData() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete Phone" ).executeUpdate(); - em.createQuery( "delete Address" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + public void cleanupTestData(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test @JiraKey(value = "HHH-8404") - public void testListIndex() { - EntityManager em = getOrCreateEntityManager(); - - em.getTransaction().begin(); - - Address address1 = new Address(); - address1.setId( "a1" ); - Phone phone1 = new Phone(); - phone1.setId( "p1" ); - phone1.setAddress( address1 ); - Phone phone2 = new Phone(); - phone2.setId( "p2" ); - - phone2.setAddress( address1 ); - address1.getPhones().add( phone1 ); - address1.getPhones().add( phone2 ); - - Address address2 = new Address(); - address2.setId( "a2" ); - Phone phone3 = new Phone(); - phone3.setId( "p3" ); - - phone3.setAddress( address2 ); - address2.getPhones().add( phone3 ); - - em.persist( phone1 ); - em.persist( phone2 ); - em.persist( phone3 ); - em.persist( address1 ); - em.persist( address2 ); - em.getTransaction().commit(); - em.clear(); - - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery
criteria = cb.createQuery( Address.class ); - Root
addressRoot = criteria.from( Address.class ); - ListJoin phones = addressRoot.join( Address_.phones ); - criteria.where( cb.gt( phones.index(), 0 ) ); - List
results = em.createQuery( criteria ).getResultList(); - - assertNotNull( results ); - // Ensure that the "index(phones) > 0" condition was included on the inner join, meaning only address1 - // (> 1 phone) was returned. - assertEquals( 1, results.size() ); - assertEquals( address1.getId(), results.get( 0 ).getId() ); + public void testListIndex(EntityManagerFactoryScope scope) { + final Address address1 = new Address(); + scope.inTransaction( entityManager -> { + address1.setId( "a1" ); + Phone phone1 = new Phone(); + phone1.setId( "p1" ); + phone1.setAddress( address1 ); + Phone phone2 = new Phone(); + phone2.setId( "p2" ); + + phone2.setAddress( address1 ); + address1.getPhones().add( phone1 ); + address1.getPhones().add( phone2 ); + + Address address2 = new Address(); + address2.setId( "a2" ); + Phone phone3 = new Phone(); + phone3.setId( "p3" ); + + phone3.setAddress( address2 ); + address2.getPhones().add( phone3 ); + + entityManager.persist( phone1 ); + entityManager.persist( phone2 ); + entityManager.persist( phone3 ); + entityManager.persist( address1 ); + entityManager.persist( address2 ); + } ) ; + scope.inEntityManager( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery
criteria = cb.createQuery( Address.class ); + Root
addressRoot = criteria.from( Address.class ); + ListJoin phones = addressRoot.join( Address_.phones ); + criteria.where( cb.gt( phones.index(), 0 ) ); + List
results = entityManager.createQuery( criteria ).getResultList(); + + assertNotNull( results ); + // Ensure that the "index(phones) > 0" condition was included on the inner join, meaning only address1 + // (> 1 phone) was returned. + assertEquals( 1, results.size() ); + assertEquals( address1.getId(), results.get( 0 ).getId() ); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/PredicateTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/PredicateTest.java index 7417fbcd69e6..0bd3b46c4769 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/PredicateTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/basic/PredicateTest.java @@ -5,7 +5,6 @@ package org.hibernate.orm.test.jpa.criteria.basic; import java.util.List; -import jakarta.persistence.EntityManager; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Path; @@ -15,13 +14,24 @@ import org.hibernate.community.dialect.InformixDialect; import org.hibernate.dialect.CockroachDialect; import org.hibernate.dialect.OracleDialect; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; +import org.hibernate.orm.test.jpa.metamodel.Address; +import org.hibernate.orm.test.jpa.metamodel.Alias; +import org.hibernate.orm.test.jpa.metamodel.Country; import org.hibernate.orm.test.jpa.metamodel.CreditCard; import org.hibernate.orm.test.jpa.metamodel.CreditCard_; +import org.hibernate.orm.test.jpa.metamodel.Customer; import org.hibernate.orm.test.jpa.metamodel.Customer_; +import org.hibernate.orm.test.jpa.metamodel.Info; +import org.hibernate.orm.test.jpa.metamodel.LineItem; import org.hibernate.orm.test.jpa.metamodel.Order; import org.hibernate.orm.test.jpa.metamodel.Order_; +import org.hibernate.orm.test.jpa.metamodel.Phone; +import org.hibernate.orm.test.jpa.metamodel.Product; +import org.hibernate.orm.test.jpa.metamodel.ShelfLife; +import org.hibernate.orm.test.jpa.metamodel.Spouse; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; import org.hibernate.testing.orm.junit.SkipForDialect; import org.junit.jupiter.api.AfterEach; @@ -38,201 +48,181 @@ * @author Steve Ebersole * @author Hardy Ferentschik */ -public class PredicateTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = { + Address.class, Alias.class, Country.class, CreditCard.class, Customer.class, + Info.class, LineItem.class, Order.class, Phone.class, Product.class, + ShelfLife.class, Spouse.class +}) +public class PredicateTest { private CriteriaBuilder builder; @BeforeEach - public void prepareTestData() { - builder = entityManagerFactory().getCriteriaBuilder(); - - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.persist( new Order( "order-1", 1.0d ) ); - em.persist( new Order( "order-2", 10.0d ) ); - em.persist( new Order( "order-3", new char[]{'r','u'} ) ); - em.getTransaction().commit(); - em.close(); + public void prepareTestData(EntityManagerFactoryScope scope) { + builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + + scope.inTransaction( entityManager -> { + entityManager.persist( new Order( "order-1", 1.0d ) ); + entityManager.persist( new Order( "order-2", 10.0d ) ); + entityManager.persist( new Order( "order-3", new char[] {'r', 'u'} ) ); + } ); } @AfterEach - public void cleanUp() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - em.createQuery( "delete from Order" ).executeUpdate(); - - em.getTransaction().commit(); - em.close(); + public void cleanUp(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testEmptyConjunction() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - // yes this is a retarded case, but explicitly allowed in the JPA spec - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - orderCriteria.select( orderRoot ); - orderCriteria.where( builder.isTrue( builder.conjunction() ) ); - em.createQuery( orderCriteria ).getResultList(); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertEquals( 3, orders.size() ); - em.getTransaction().commit(); - em.close(); + public void testEmptyConjunction(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + // yes this is a retarded case, but explicitly allowed in the JPA spec + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + orderCriteria.select( orderRoot ); + orderCriteria.where( builder.isTrue( builder.conjunction() ) ); + entityManager.createQuery( orderCriteria ).getResultList(); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertEquals( 3, orders.size() ); + } ); } @Test - public void testEmptyDisjunction() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - // yes this is a retarded case, but explicitly allowed in the JPA spec - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - orderCriteria.select( orderRoot ); - orderCriteria.where( builder.isFalse( builder.disjunction() ) ); - em.createQuery( orderCriteria ).getResultList(); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertEquals( 3, orders.size() ); - em.getTransaction().commit(); - em.close(); + public void testEmptyDisjunction(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + // yes this is a retarded case, but explicitly allowed in the JPA spec + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + orderCriteria.select( orderRoot ); + orderCriteria.where( builder.isFalse( builder.disjunction() ) ); + entityManager.createQuery( orderCriteria ).getResultList(); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertEquals( 3, orders.size() ); + } ); } /** * Check simple not. */ @Test - public void testSimpleNot() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - - orderCriteria.select( orderRoot ); - final Predicate p = builder.not( builder.equal( orderRoot.get( "id" ), "order-1" ) ); - assertEquals( Predicate.BooleanOperator.AND, p.getOperator() ); - orderCriteria.where( p ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertEquals( 2, orders.size() ); - em.getTransaction().commit(); - em.close(); + public void testSimpleNot(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + + orderCriteria.select( orderRoot ); + final Predicate p = builder.not( builder.equal( orderRoot.get( "id" ), "order-1" ) ); + assertEquals( Predicate.BooleanOperator.AND, p.getOperator() ); + orderCriteria.where( p ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertEquals( 2, orders.size() ); + } ); } /** * Check simple not. */ @Test - public void testSimpleNot2() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - - orderCriteria.select( orderRoot ); - final Predicate p = builder.equal( orderRoot.get( "id" ), "order-1" ).not(); - assertEquals( Predicate.BooleanOperator.AND, p.getOperator() ); - orderCriteria.where( p ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertEquals( 2, orders.size() ); - em.getTransaction().commit(); - em.close(); - + public void testSimpleNot2(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + + orderCriteria.select( orderRoot ); + final Predicate p = builder.equal( orderRoot.get( "id" ), "order-1" ).not(); + assertEquals( Predicate.BooleanOperator.AND, p.getOperator() ); + orderCriteria.where( p ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertEquals( 2, orders.size() ); + } ); } /** * Check complicated not. */ @Test - public void testComplicatedNotOr() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - - orderCriteria.select( orderRoot ); - Predicate p1 = builder.equal( orderRoot.get( "id" ), "order-1" ); - Predicate p2 = builder.equal( orderRoot.get( "id" ), "order-2" ); - Predicate compoundPredicate = builder.not( builder.or( p1, p2 ) ); - // negated OR should become an AND - assertEquals( Predicate.BooleanOperator.AND, compoundPredicate.getOperator() ); - orderCriteria.where( compoundPredicate ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertEquals( 1, orders.size() ); - Order order = orders.get( 0 ); - assertEquals( "order-3", order.getId() ); - em.getTransaction().commit(); - em.close(); + public void testComplicatedNotOr(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + + orderCriteria.select( orderRoot ); + Predicate p1 = builder.equal( orderRoot.get( "id" ), "order-1" ); + Predicate p2 = builder.equal( orderRoot.get( "id" ), "order-2" ); + Predicate compoundPredicate = builder.not( builder.or( p1, p2 ) ); + // negated OR should become an AND + assertEquals( Predicate.BooleanOperator.AND, compoundPredicate.getOperator() ); + orderCriteria.where( compoundPredicate ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertEquals( 1, orders.size() ); + Order order = orders.get( 0 ); + assertEquals( "order-3", order.getId() ); + } ); } /** * Check complicated not. */ @Test - public void testNotMultipleOr() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - - orderCriteria.select( orderRoot ); - Predicate p1 = builder.equal( orderRoot.get( "id" ), "order-1" ); - Predicate p2 = builder.equal( orderRoot.get( "id" ), "order-2" ); - Predicate p3 = builder.equal( orderRoot.get( "id" ), "order-3" ); - final Predicate compoundPredicate = builder.or( p1, p2, p3 ).not(); - // negated OR should become an AND - assertEquals( Predicate.BooleanOperator.AND, compoundPredicate.getOperator() ); - orderCriteria.where( compoundPredicate ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertEquals( 0, orders.size() ); - em.getTransaction().commit(); - em.close(); + public void testNotMultipleOr(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + + orderCriteria.select( orderRoot ); + Predicate p1 = builder.equal( orderRoot.get( "id" ), "order-1" ); + Predicate p2 = builder.equal( orderRoot.get( "id" ), "order-2" ); + Predicate p3 = builder.equal( orderRoot.get( "id" ), "order-3" ); + final Predicate compoundPredicate = builder.or( p1, p2, p3 ).not(); + // negated OR should become an AND + assertEquals( Predicate.BooleanOperator.AND, compoundPredicate.getOperator() ); + orderCriteria.where( compoundPredicate ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertEquals( 0, orders.size() ); + } ); } /** * Check complicated not. */ @Test - public void testComplicatedNotAnd() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - - orderCriteria.select( orderRoot ); - Predicate p1 = builder.equal( orderRoot.get( "id" ), "order-1" ); - Predicate p2 = builder.equal( orderRoot.get( "id" ), "order-2" ); - Predicate compoundPredicate = builder.and( p1, p2 ).not(); - orderCriteria.where( compoundPredicate ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertEquals( 3, orders.size() ); - em.getTransaction().commit(); - em.close(); + public void testComplicatedNotAnd(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + + orderCriteria.select( orderRoot ); + Predicate p1 = builder.equal( orderRoot.get( "id" ), "order-1" ); + Predicate p2 = builder.equal( orderRoot.get( "id" ), "order-2" ); + Predicate compoundPredicate = builder.and( p1, p2 ).not(); + orderCriteria.where( compoundPredicate ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertEquals( 3, orders.size() ); + } ); } /** * Check predicate for field which has simple char array type (char[]). */ @Test - public void testCharArray() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - - orderCriteria.select( orderRoot ); - Predicate p = builder.equal( orderRoot.get( "domen" ), new char[]{'r','u'} ); - orderCriteria.where( p ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertEquals( 1, orders.size() ); - em.getTransaction().commit(); - em.close(); + public void testCharArray(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + + orderCriteria.select( orderRoot ); + Predicate p = builder.equal( orderRoot.get( "domen" ), new char[] {'r', 'u'} ); + orderCriteria.where( p ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertEquals( 1, orders.size() ); + } ); } /** @@ -244,118 +234,106 @@ public void testCharArray() { reason = "Oracle12cDialect uses blob to store byte arrays and it's not possible to compare blobs with simple equality operators.") @SkipForDialect(dialectClass = InformixDialect.class, reason = "Blobs are not allowed in this expression") - public void testByteArray() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - - orderCriteria.select( orderRoot ); - Predicate p = builder.equal( orderRoot.get( "number" ), new byte[]{'1','2'} ); - orderCriteria.where( p ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertTrue( orders.isEmpty() ); - em.getTransaction().commit(); - em.close(); + public void testByteArray(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + + orderCriteria.select( orderRoot ); + Predicate p = builder.equal( orderRoot.get( "number" ), new byte[] {'1', '2'} ); + orderCriteria.where( p ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertTrue( orders.isEmpty() ); + } ); } @Test @JiraKey( value = "HHH-5803" ) @SkipForDialect( dialectClass = CockroachDialect.class, reason = "https://github.com/cockroachdb/cockroach/issues/41943") - public void testQuotientConversion() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - - Long longValue = 999999999L; - Path doublePath = orderRoot.get( Order_.totalPrice ); - Path integerPath = orderRoot.get( Order_.customer ).get( Customer_.age ); - - orderCriteria.select( orderRoot ); - Predicate p = builder.ge( - builder.quot( integerPath, doublePath ), - longValue - ); - orderCriteria.where( p ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertTrue( orders.isEmpty() ); - em.getTransaction().commit(); - em.close(); + public void testQuotientConversion(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + + Long longValue = 999999999L; + Path doublePath = orderRoot.get( Order_.totalPrice ); + Path integerPath = orderRoot.get( Order_.customer ).get( Customer_.age ); + + orderCriteria.select( orderRoot ); + Predicate p = builder.ge( + builder.quot( integerPath, doublePath ), + longValue + ); + orderCriteria.where( p ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertTrue( orders.isEmpty() ); + } ); } @Test - public void testExplicitBuilderBooleanHandling() { + public void testExplicitBuilderBooleanHandling(EntityManagerFactoryScope scope) { // just checking syntax of the resulting query - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - // note : these may fail on various matrix db jobs depending on how the dialect handles booleans - { - CriteriaQuery criteriaQuery = builder.createQuery( CreditCard.class ); - Root root = criteriaQuery.from( CreditCard.class ); - criteriaQuery.where( builder.isFalse( root.get( CreditCard_.approved ) ) ); - em.createQuery( criteriaQuery ).getResultList(); - } - - { - CriteriaQuery criteriaQuery = builder.createQuery( Order.class ); - Root root = criteriaQuery.from( Order.class ); - criteriaQuery.where( builder.isFalse( root.get( Order_.creditCard ).get( CreditCard_.approved ) ) ); - em.createQuery( criteriaQuery ).getResultList(); - } - - em.getTransaction().commit(); - em.close(); + scope.inTransaction( entityManager -> { + + // note : these may fail on various matrix db jobs depending on how the dialect handles booleans + { + CriteriaQuery criteriaQuery = builder.createQuery( CreditCard.class ); + Root root = criteriaQuery.from( CreditCard.class ); + criteriaQuery.where( builder.isFalse( root.get( CreditCard_.approved ) ) ); + entityManager.createQuery( criteriaQuery ).getResultList(); + } + + { + CriteriaQuery criteriaQuery = builder.createQuery( Order.class ); + Root root = criteriaQuery.from( Order.class ); + criteriaQuery.where( builder.isFalse( root.get( Order_.creditCard ).get( CreditCard_.approved ) ) ); + entityManager.createQuery( criteriaQuery ).getResultList(); + } + + } ); } @Test @JiraKey( value = "HHH-8901" ) - public void testEmptyInPredicate() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - orderCriteria.select( orderRoot ); - orderCriteria.where( builder.in( orderRoot.get("totalPrice") ) ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertTrue( orders.isEmpty() ); - em.getTransaction().commit(); - em.close(); + public void testEmptyInPredicate(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + orderCriteria.select( orderRoot ); + orderCriteria.where( builder.in( orderRoot.get( "totalPrice" ) ) ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertTrue( orders.isEmpty() ); + } ); } @Test @JiraKey( value = "HHH-17804" ) - public void testEmptyInPredicate2() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - orderCriteria.select( orderRoot ); - orderCriteria.where( builder.in( orderRoot.get("id") ) ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertTrue( orders.isEmpty() ); - em.getTransaction().commit(); - em.close(); + public void testEmptyInPredicate2(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + orderCriteria.select( orderRoot ); + orderCriteria.where( builder.in( orderRoot.get( "id" ) ) ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertTrue( orders.isEmpty() ); + } ); } @Test @JiraKey( value = "HHH-17804" ) - public void testEmptyInPredicate3() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaQuery orderCriteria = builder.createQuery( Order.class ); - Root orderRoot = orderCriteria.from( Order.class ); - orderCriteria.select( orderRoot ); - orderCriteria.where( builder.in( orderRoot.get("id") ).not() ); - - List orders = em.createQuery( orderCriteria ).getResultList(); - assertFalse( orders.isEmpty() ); - em.getTransaction().commit(); - em.close(); + public void testEmptyInPredicate3(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaQuery orderCriteria = builder.createQuery( Order.class ); + Root orderRoot = orderCriteria.from( Order.class ); + orderCriteria.select( orderRoot ); + orderCriteria.where( builder.in( orderRoot.get( "id" ) ).not() ); + + List orders = entityManager.createQuery( orderCriteria ).getResultList(); + assertFalse( orders.isEmpty() ); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/components/ComponentInWhereClauseTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/components/ComponentInWhereClauseTest.java index 55015f5dea7d..20027716c5c3 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/components/ComponentInWhereClauseTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/components/ComponentInWhereClauseTest.java @@ -100,7 +100,7 @@ public void testSizeExpressionForTheOneToManyPropertyOfAComponentHql(EntityManag scope.inTransaction( entityManager -> { final String hql = "from Employee e where size( e.projects.previousProjects ) = 2"; - final List resultsList = entityManager.createQuery( hql ).getResultList(); + final List resultsList = entityManager.createQuery( hql ).getResultList(); assertThat( resultsList.size(), is( 1 ) ); } ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/enumcollection/EnumIsMemberTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/enumcollection/EnumIsMemberTest.java index 79743085eff3..1040d6e70acc 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/enumcollection/EnumIsMemberTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/enumcollection/EnumIsMemberTest.java @@ -6,19 +6,19 @@ import java.util.List; import java.util.Set; -import jakarta.persistence.EntityManager; + import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Expression; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Mote that these are simply performing syntax checking (can the criteria query @@ -26,47 +26,37 @@ * * @author Steve Ebersole */ -public class EnumIsMemberTest extends BaseEntityManagerFunctionalTestCase { - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] {User.class}; - } +@Jpa(annotatedClasses = {User.class}) +public class EnumIsMemberTest { @Test @JiraKey(value = "HHH-9605") - public void testQueryEnumCollection() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - User user = new User(); - user.setId( 1l ); - user.getRoles().add( User.Role.Admin ); - em.persist( user ); - em.getTransaction().commit(); - em.getTransaction().begin(); - - CriteriaBuilder builder = em.getCriteriaBuilder(); - - CriteriaQuery query = builder.createQuery( User.class ); - Root root = query.from( User.class ); - - Expression> roles = root.get( User_.roles ); - - // Using the correct collection of enums and an enum parameter - query.where( builder.isMember( User.Role.Admin, roles ) ); - - TypedQuery typedQuery = em.createQuery( query ); - List users = typedQuery.getResultList(); - assertEquals( 1, users.size() ); - - em.getTransaction().commit(); - em.getTransaction().begin(); - // delete - em.remove( user ); - em.getTransaction().commit(); - + public void testQueryEnumCollection(EntityManagerFactoryScope scope) { + final User user = new User(); + scope.inTransaction( entityManager -> { + user.setId( 1L ); + user.getRoles().add( User.Role.Admin ); + entityManager.persist( user ); + } ); + + scope.inTransaction( entityManager -> { + + CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery query = builder.createQuery( User.class ); + Root root = query.from( User.class ); + Expression> roles = root.get( User_.roles ); + // Using the correct collection of enums and an enum parameter + query.where( builder.isMember( User.Role.Admin, roles ) ); + TypedQuery typedQuery = entityManager.createQuery( query ); + + List users = typedQuery.getResultList(); + assertEquals( 1, users.size() ); + } ); + + scope.inTransaction( entityManager -> { + // delete + entityManager.remove( entityManager.find(User.class, 1L ) ); + } ); } - } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/fetchscroll/CriteriaToScrollableResultsFetchTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/fetchscroll/CriteriaToScrollableResultsFetchTest.java index 872d1ec52428..40d19982466b 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/fetchscroll/CriteriaToScrollableResultsFetchTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/fetchscroll/CriteriaToScrollableResultsFetchTest.java @@ -4,13 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria.fetchscroll; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - import jakarta.persistence.EntityManager; import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; @@ -20,150 +13,125 @@ import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; -import org.hibernate.query.Query; import org.hibernate.ScrollableResults; import org.hibernate.dialect.HANADialect; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; -import org.junit.Test; -import org.hibernate.testing.SkipForDialect; +import org.hibernate.query.Query; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.SkipForDialect; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * @author Chris Cranford */ @JiraKey(value = "HHH-10062") -public class CriteriaToScrollableResultsFetchTest extends BaseEntityManagerFunctionalTestCase { - - @Override - public Class[] getAnnotatedClasses() { - return new Class[]{ - Customer.class, - Order.class, - OrderLine.class, - Product.class, - PurchaseOrg.class, - Facility.class, - Site.class - }; +@Jpa(annotatedClasses = { + Customer.class, + Order.class, + OrderLine.class, + Product.class, + PurchaseOrg.class, + Facility.class, + Site.class +}) +public class CriteriaToScrollableResultsFetchTest { + + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - @SkipForDialect(value = HANADialect.class, comment = "HANA only supports forward-only cursors") - public void testWithScroll() { + @SkipForDialect(dialectClass = HANADialect.class, reason = "HANA only supports forward-only cursors") + public void testWithScroll(EntityManagerFactoryScope scope) { // Creates data necessary for test - Long facilityId = populate(); + Long facilityId = populate(scope); // Controller iterates the data - for ( OrderLine line : getOrderLinesScrolled( facilityId ) ) { + for ( OrderLine line : getOrderLinesScrolled( scope, facilityId ) ) { // This should ~NOT~ fail with a LazilyLoadException assertNotNull( line.getProduct().getFacility().getSite().getName() ); } } @Test - public void testNoScroll() { + public void testNoScroll(EntityManagerFactoryScope scope) { // Creates data necessary for test. - Long facilityId = populate(); + Long facilityId = populate(scope); // Controller iterates the data - for ( OrderLine line : getOrderLinesJpaFetched( facilityId ) ) { + for ( OrderLine line : getOrderLinesJpaFetched( scope, facilityId ) ) { assertNotNull( line.getProduct().getFacility().getSite().getName() ); } } - private List getOrderLinesScrolled(Long facilityId) { - EntityManager em = getOrCreateEntityManager(); - try { - em.getTransaction().begin(); + private List getOrderLinesScrolled(EntityManagerFactoryScope scope, Long facilityId) { + return scope.fromTransaction( entityManager -> { - Set purchaseOrgs = getPurchaseOrgsByFacilityId( facilityId, em ); - assertEquals( "Expected one purchase organization.", 1, purchaseOrgs.size() ); - System.out.println( purchaseOrgs ); + Set purchaseOrgs = getPurchaseOrgsByFacilityId( facilityId, entityManager ); + assertEquals( 1, purchaseOrgs.size(), "Expected one purchase organization." ); - TypedQuery query = getOrderLinesQuery( purchaseOrgs, em ); + TypedQuery query = getOrderLinesQuery( entityManager, purchaseOrgs ); - Query hibernateQuery = query.unwrap( Query.class ); + Query hibernateQuery = query.unwrap( Query.class ); hibernateQuery.setReadOnly( true ); hibernateQuery.setCacheable( false ); List lines = new ArrayList<>(); - try (ScrollableResults scrollableResults = hibernateQuery.scroll()) { + try (ScrollableResults scrollableResults = hibernateQuery.scroll()) { scrollableResults.last(); - int rows = scrollableResults.getRowNumber() + 1; scrollableResults.beforeFirst(); while ( scrollableResults.next() ) { lines.add( (OrderLine) scrollableResults.get() ); } } assertNotNull( lines ); - assertEquals( "Expected one order line", 1, lines.size() ); + assertEquals( 1, lines.size(), "Expected one order line" ); - em.getTransaction().commit(); return lines; - } - catch (Throwable t) { - if ( em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw t; - } - finally { - em.close(); - } + } ); } - private List getOrderLinesJpaFetched(Long facilityId) { - EntityManager em = getOrCreateEntityManager(); - try { - em.getTransaction().begin(); + private List getOrderLinesJpaFetched(EntityManagerFactoryScope scope, Long facilityId) { + return scope.fromTransaction( entityManager -> { - Set purchaseOrgs = getPurchaseOrgsByFacilityId( facilityId, em ); - assertEquals( "Expected one purchase organization.", 1, purchaseOrgs.size() ); - System.out.println( purchaseOrgs ); + Set purchaseOrgs = getPurchaseOrgsByFacilityId( facilityId, entityManager ); + assertEquals( 1, purchaseOrgs.size(), "Expected one purchase organization." ); - TypedQuery query = getOrderLinesQuery( purchaseOrgs, em ); - List lines = query.getResultList(); - em.getTransaction().commit(); - return lines; - } - catch (Throwable t) { - if ( em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw t; - } - finally { - em.close(); - } + TypedQuery query = getOrderLinesQuery( entityManager, purchaseOrgs ); + return query.getResultList(); + } ); } private Set getPurchaseOrgsByFacilityId(Long facilityId, EntityManager em) { Set orgs = new HashSet<>(); - try { - for ( PurchaseOrg purchaseOrg : findAll( PurchaseOrg.class, em ) ) { - for ( Facility facility : purchaseOrg.getFacilities() ) { - if ( facility.getId().equals( facilityId ) ) { - orgs.add( purchaseOrg ); - break; - } + for ( PurchaseOrg purchaseOrg : findAll( PurchaseOrg.class, em ) ) { + for ( Facility facility : purchaseOrg.getFacilities() ) { + if ( facility.getId().equals( facilityId ) ) { + orgs.add( purchaseOrg ); + break; } } } - catch (Exception e) { - - } - finally { - return orgs; - } + return orgs; } - private List findAll(Class clazz, EntityManager em) { - return em.createQuery( "SELECT o FROM " + clazz.getSimpleName() + " o", clazz ).getResultList(); + private List findAll(Class clazz, EntityManager entityManager) { + return entityManager.createQuery( "SELECT o FROM " + clazz.getSimpleName() + " o", clazz ).getResultList(); } - private TypedQuery getOrderLinesQuery(Collection purchaseOrgs, EntityManager em) { - CriteriaBuilder cb = em.getCriteriaBuilder(); + private TypedQuery getOrderLinesQuery(EntityManager entityManager, Collection purchaseOrgs) { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery( OrderLine.class ); Root root = query.from( OrderLine.class ); Path idPath = root.get( OrderLine_.id ); @@ -183,61 +151,46 @@ private TypedQuery getOrderLinesQuery(Collection purchas query.select( root ).where( predicates.toArray( new Predicate[predicates.size()] ) ); - return em.createQuery( query ); + return entityManager.createQuery( query ); } - private Long populate() { - final EntityManager em = getOrCreateEntityManager(); - try { - em.getTransaction().begin(); - + private Long populate(EntityManagerFactoryScope scope) { + return scope.fromTransaction( entityManager -> { Customer customer = new Customer(); customer.setName( "MGM" ); - em.persist( customer ); + entityManager.persist( customer ); Site site = new Site(); site.setName( "NEW YORK" ); site.setCustomer( customer ); - em.persist( site ); + entityManager.persist( site ); Facility facility = new Facility(); facility.setName( "ACME" ); facility.setSite( site ); facility.setCustomer( customer ); - em.persist( facility ); + entityManager.persist( facility ); PurchaseOrg purchaseOrg = new PurchaseOrg(); purchaseOrg.setName( "LOONEY TUNES" ); purchaseOrg.setCustomer( customer ); - purchaseOrg.setFacilities( Arrays.asList( facility ) ); - em.persist( purchaseOrg ); + purchaseOrg.setFacilities( List.of( facility ) ); + entityManager.persist( purchaseOrg ); Product product = new Product( facility, "0000 0001" ); - em.persist( product ); + entityManager.persist( product ); Order order = new Order( purchaseOrg, "12345" ); - OrderLine line1 = new OrderLine( order, 1L, product ); + OrderLine line1 = new OrderLine( order, 1L, product ); Set lines = new HashSet<>(); lines.add( line1 ); - order.setLines( lines ); - em.persist( order ); - - em.getTransaction().commit(); + entityManager.persist( order ); return facility.getId(); - } - catch (Throwable t) { - if ( em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw t; - } - finally { - em.close(); - } + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/idclass/IdClassPredicateTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/idclass/IdClassPredicateTest.java index beb802ced063..592709e50fd4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/idclass/IdClassPredicateTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/idclass/IdClassPredicateTest.java @@ -6,206 +6,167 @@ import java.util.ArrayList; import java.util.List; -import jakarta.persistence.EntityManager; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Expression; import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; - /** * @author Erich Heard */ -public class IdClassPredicateTest extends AbstractMetamodelSpecificTest { - - @Override - public Class[] getAnnotatedClasses() { - return new Class[] { - Widget.class, - Tool.class - }; - } +@Jpa(annotatedClasses = {Widget.class, Tool.class}) +public class IdClassPredicateTest { @BeforeEach - public void prepareTestData() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - - Widget w = new Widget(); - w.setCode( "AAA" ); - w.setDivision( "NA" ); - w.setCost( 10.00 ); - em.persist( w ); - - w = new Widget(); - w.setCode( "AAA" ); - w.setDivision( "EU" ); - w.setCost( 12.50 ); - em.persist( w ); - - w = new Widget(); - w.setCode( "AAA" ); - w.setDivision( "ASIA" ); - w.setCost( 110.00 ); - em.persist( w ); - - w = new Widget(); - w.setCode( "BBB" ); - w.setDivision( "NA" ); - w.setCost( 14.00 ); - em.persist( w ); - - w = new Widget(); - w.setCode( "BBB" ); - w.setDivision( "EU" ); - w.setCost( 8.75 ); - em.persist( w ); - - w = new Widget(); - w.setCode( "BBB" ); - w.setDivision( "ASIA" ); - w.setCost( 86.22 ); - em.persist( w ); - - Tool t = new Tool(); - t.setName( "AAA" ); - t.setType( "NA" ); - t.setCost( 10.00 ); - em.persist( t ); - - t = new Tool(); - t.setName( "AAA" ); - t.setType( "EU" ); - t.setCost( 12.50 ); - em.persist( t ); - - t = new Tool(); - t.setName( "AAA" ); - t.setType( "ASIA" ); - t.setCost( 110.00 ); - em.persist( t ); - - t = new Tool(); - t.setName( "BBB" ); - t.setType( "NA" ); - t.setCost( 14.00 ); - em.persist( t ); - - t = new Tool(); - t.setName( "BBB" ); - t.setType( "EU" ); - t.setCost( 8.75 ); - em.persist( t ); - - t = new Tool(); - t.setName( "BBB" ); - t.setType( "ASIA" ); - t.setCost( 86.22 ); - em.persist( t ); - - em.getTransaction().commit(); - em.close(); + public void prepareTestData(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + + Widget w = new Widget(); + w.setCode( "AAA" ); + w.setDivision( "NA" ); + w.setCost( 10.00 ); + entityManager.persist( w ); + + w = new Widget(); + w.setCode( "AAA" ); + w.setDivision( "EU" ); + w.setCost( 12.50 ); + entityManager.persist( w ); + + w = new Widget(); + w.setCode( "AAA" ); + w.setDivision( "ASIA" ); + w.setCost( 110.00 ); + entityManager.persist( w ); + + w = new Widget(); + w.setCode( "BBB" ); + w.setDivision( "NA" ); + w.setCost( 14.00 ); + entityManager.persist( w ); + + w = new Widget(); + w.setCode( "BBB" ); + w.setDivision( "EU" ); + w.setCost( 8.75 ); + entityManager.persist( w ); + + w = new Widget(); + w.setCode( "BBB" ); + w.setDivision( "ASIA" ); + w.setCost( 86.22 ); + entityManager.persist( w ); + + Tool t = new Tool(); + t.setName( "AAA" ); + t.setType( "NA" ); + t.setCost( 10.00 ); + entityManager.persist( t ); + + t = new Tool(); + t.setName( "AAA" ); + t.setType( "EU" ); + t.setCost( 12.50 ); + entityManager.persist( t ); + + t = new Tool(); + t.setName( "AAA" ); + t.setType( "ASIA" ); + t.setCost( 110.00 ); + entityManager.persist( t ); + + t = new Tool(); + t.setName( "BBB" ); + t.setType( "NA" ); + t.setCost( 14.00 ); + entityManager.persist( t ); + + t = new Tool(); + t.setName( "BBB" ); + t.setType( "EU" ); + t.setCost( 8.75 ); + entityManager.persist( t ); + + t = new Tool(); + t.setName( "BBB" ); + t.setType( "ASIA" ); + t.setCost( 86.22 ); + entityManager.persist( t ); + + } ); } - @AfterEach - public void cleanupTestData() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete Widget" ).executeUpdate(); - em.createQuery( "delete Tool" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + public void cleanupTestData(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testCountIdClassAttributes(){ - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery(Long.class); - Root path = cq.from(Widget.class); - Expression countSelection = cb.count(path); - cq.select(countSelection); - Long count = em.createQuery(cq).getSingleResult(); -// // Packaging arguments for use in query. -// List divisions = new ArrayList( ); -// divisions.add( "NA" ); -// divisions.add( "EU" ); -// -// // Building the query. -// CriteriaBuilder criteria = em.getCriteriaBuilder( ); -// CriteriaQuery query = criteria.createQuery( Widget.class ); -// Root root = query.from( Widget.class ); -// -// Predicate predicate = root.get( "division" ).in( divisions ); -// query.where( predicate ); -// -// // Retrieving query.; -// List widgets = em.createQuery( query ).getResultList( ); -// Assert.assertEquals( 4, widgets.size() ); - - em.getTransaction().commit(); - em.close(); + public void testCountIdClassAttributes(EntityManagerFactoryScope scope){ + scope.inTransaction( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery( Long.class ); + Root path = cq.from( Widget.class ); + Expression countSelection = cb.count( path ); + cq.select( countSelection ); + entityManager.createQuery( cq ).getSingleResult(); + } ); } @Test - public void testDeclaredIdClassAttributes( ) { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); + public void testDeclaredIdClassAttributes(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { - // Packaging arguments for use in query. - List divisions = new ArrayList( ); - divisions.add( "NA" ); - divisions.add( "EU" ); + // Packaging arguments for use in query. + List divisions = new ArrayList<>(); + divisions.add( "NA" ); + divisions.add( "EU" ); - // Building the query. - CriteriaBuilder criteria = em.getCriteriaBuilder( ); - CriteriaQuery query = criteria.createQuery( Widget.class ); - Root root = query.from( Widget.class ); + // Building the query. + CriteriaBuilder criteria = entityManager.getCriteriaBuilder(); + CriteriaQuery query = criteria.createQuery( Widget.class ); + Root root = query.from( Widget.class ); - Predicate predicate = root.get( "division" ).in( divisions ); - query.where( predicate ); + Predicate predicate = root.get( "division" ).in( divisions ); + query.where( predicate ); - // Retrieving query.; - List widgets = em.createQuery( query ).getResultList( ); - Assertions.assertEquals( 4, widgets.size() ); + // Retrieving query.; + List widgets = entityManager.createQuery( query ).getResultList(); + Assertions.assertEquals( 4, widgets.size() ); - em.getTransaction().commit(); - em.close(); + } ); } @Test - public void testSupertypeIdClassAttributes( ) { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); + public void testSupertypeIdClassAttributes(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { - // Packaging arguments for use in query. - List types = new ArrayList( ); - types.add( "NA" ); - types.add( "EU" ); + // Packaging arguments for use in query. + List types = new ArrayList<>(); + types.add( "NA" ); + types.add( "EU" ); - // Building the query. - CriteriaBuilder criteria = em.getCriteriaBuilder( ); - CriteriaQuery query = criteria.createQuery( Tool.class ); - Root root = query.from( Tool.class ); + // Building the query. + CriteriaBuilder criteria = entityManager.getCriteriaBuilder(); + CriteriaQuery query = criteria.createQuery( Tool.class ); + Root root = query.from( Tool.class ); - Predicate predicate = root.get( "type" ).in( types ); - query.where( predicate ); + Predicate predicate = root.get( "type" ).in( types ); + query.where( predicate ); - // Retrieving query. - List tools = em.createQuery( query ).getResultList( ); - Assertions.assertEquals( 4, tools.size() ); + // Retrieving query. + List tools = entityManager.createQuery( query ).getResultList(); + Assertions.assertEquals( 4, tools.size() ); - em.getTransaction().commit(); - em.close(); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/AbstractPathImplTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/AbstractPathImplTest.java index 854c19cce099..a732303fff2e 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/AbstractPathImplTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/AbstractPathImplTest.java @@ -4,138 +4,134 @@ */ package org.hibernate.orm.test.jpa.criteria.paths; -import jakarta.persistence.EntityManager; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Path; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; import org.hibernate.orm.test.jpa.metamodel.Address; +import org.hibernate.orm.test.jpa.metamodel.Alias; +import org.hibernate.orm.test.jpa.metamodel.Country; +import org.hibernate.orm.test.jpa.metamodel.CreditCard; +import org.hibernate.orm.test.jpa.metamodel.Customer; +import org.hibernate.orm.test.jpa.metamodel.Entity1; +import org.hibernate.orm.test.jpa.metamodel.Entity2; +import org.hibernate.orm.test.jpa.metamodel.Entity3; +import org.hibernate.orm.test.jpa.metamodel.Info; +import org.hibernate.orm.test.jpa.metamodel.LineItem; import org.hibernate.orm.test.jpa.metamodel.Order; +import org.hibernate.orm.test.jpa.metamodel.Phone; +import org.hibernate.orm.test.jpa.metamodel.Product; +import org.hibernate.orm.test.jpa.metamodel.ShelfLife; +import org.hibernate.orm.test.jpa.metamodel.Spouse; import org.hibernate.orm.test.jpa.metamodel.Thing; import org.hibernate.orm.test.jpa.metamodel.ThingWithQuantity; +import org.hibernate.orm.test.jpa.metamodel.VersionedEntity; -import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.ExpectedException; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * @author Michael Rudolf * @author James Gilbertson */ -public class AbstractPathImplTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = { + Address.class, Alias.class, Country.class, CreditCard.class, Customer.class, + Entity1.class, Entity2.class, Entity3.class, + Info.class, LineItem.class, Order.class, Phone.class, Product.class, + ShelfLife.class, Spouse.class, Thing.class, ThingWithQuantity.class, + VersionedEntity.class +}) +public class AbstractPathImplTest { @BeforeEach - public void prepareTestData() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - Thing thing = new Thing(); - thing.setId( "thing1" ); - thing.setName( "A Thing" ); - em.persist( thing ); - - thing = new Thing(); - thing.setId( "thing2" ); - thing.setName( "Another Thing" ); - em.persist( thing ); - - ThingWithQuantity thingWithQuantity = new ThingWithQuantity(); - thingWithQuantity.setId( "thingWithQuantity3" ); - thingWithQuantity.setName( "3 Things" ); - thingWithQuantity.setQuantity( 3 ); - em.persist( thingWithQuantity ); - - em.getTransaction().commit(); - em.close(); + public void prepareTestData(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + + Thing thing = new Thing(); + thing.setId( "thing1" ); + thing.setName( "A Thing" ); + entityManager.persist( thing ); + + thing = new Thing(); + thing.setId( "thing2" ); + thing.setName( "Another Thing" ); + entityManager.persist( thing ); + + ThingWithQuantity thingWithQuantity = new ThingWithQuantity(); + thingWithQuantity.setId( "thingWithQuantity3" ); + thingWithQuantity.setName( "3 Things" ); + thingWithQuantity.setQuantity( 3 ); + entityManager.persist( thingWithQuantity ); + + } ); } @AfterEach - public void cleanupTestData() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - em.remove( em.find( Thing.class, "thing1" ) ); - em.remove( em.find( Thing.class, "thing2" ) ); - em.remove( em.find( ThingWithQuantity.class, "thingWithQuantity3" ) ); - em.getTransaction().commit(); - em.close(); + public void cleanupTestData(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @ExpectedException(value = IllegalArgumentException.class) @Test - public void testGetNonExistingAttributeViaName() { - EntityManager em = getOrCreateEntityManager(); - try { - CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); + public void testGetNonExistingAttributeViaName(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery criteria = criteriaBuilder.createQuery( Order.class ); Root orderRoot = criteria.from( Order.class ); orderRoot.get( "nonExistingAttribute" ); - } - finally { - em.close(); - } + } ); } @Test - public void testIllegalDereference() { - EntityManager em = getOrCreateEntityManager(); - try { - CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); + public void testIllegalDereference(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery criteria = criteriaBuilder.createQuery( Order.class ); Root orderRoot = criteria.from( Order.class ); - Path simplePath = orderRoot.get( "totalPrice" ); + Path simplePath = orderRoot.get( "totalPrice" ); // this should cause an ISE... - try { - simplePath.get( "yabbadabbado" ); - fail( "Attempt to dereference basic path should throw IllegalStateException" ); - } - catch (IllegalStateException expected) { - } - } - finally { - em.close(); - } + assertThrows( + IllegalStateException.class, + () -> simplePath.get( "yabbadabbadoo" ), + "Attempting to dereference a basic path should throw IllegalStateException" + ); + } ); } @Test - public void testTypeExpression() { - EntityManager em = getOrCreateEntityManager(); - try { - CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); + public void testTypeExpression(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery criteria = criteriaBuilder.createQuery( Thing.class ); Root thingRoot = criteria.from( Thing.class ); criteria.select( thingRoot ); - assertEquals( 3, em.createQuery( criteria ).getResultList().size() ); + assertEquals( 3, entityManager.createQuery( criteria ).getResultList().size() ); criteria.where( criteriaBuilder.equal( thingRoot.type(), criteriaBuilder.literal( Thing.class ) ) ); - assertEquals( 2, em.createQuery( criteria ).getResultList().size() ); - } - finally { - em.close(); - } + assertEquals( 2, entityManager.createQuery( criteria ).getResultList().size() ); + } ); } @Test @JiraKey( value = "HHH-15433") - public void testTypeExpressionWithoutInheritance() { - EntityManager em = getOrCreateEntityManager(); - try { - CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); + public void testTypeExpressionWithoutInheritance(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery
criteria = criteriaBuilder.createQuery( Address.class ); Root
addressRoot = criteria.from( Address.class ); criteria.select( addressRoot ); criteria.where( criteriaBuilder.equal( addressRoot.type(), criteriaBuilder.literal( Address.class ) ) ); - em.createQuery( criteria ).getResultList(); - } - finally { - em.close(); - } + entityManager.createQuery( criteria ).getResultList(); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/FetchAndJoinTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/FetchAndJoinTest.java index aee7f0ed9253..e8af428d47b4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/FetchAndJoinTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/FetchAndJoinTest.java @@ -4,7 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria.paths; -import jakarta.persistence.EntityManager; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Fetch; @@ -12,39 +11,41 @@ import jakarta.persistence.criteria.JoinType; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; import org.hibernate.orm.test.jpa.metamodel.Entity1; import org.hibernate.orm.test.jpa.metamodel.Entity1_; import org.hibernate.orm.test.jpa.metamodel.Entity2; import org.hibernate.orm.test.jpa.metamodel.Entity2_; +import org.hibernate.orm.test.jpa.metamodel.Entity3; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.Test; /** * @author Gail Badner */ -public class FetchAndJoinTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = {Entity1.class, Entity2.class, Entity3.class}) +public class FetchAndJoinTest { @Test - public void testImplicitJoinFromExplicitCollectionJoin() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); + public void testImplicitJoinFromExplicitCollectionJoin(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { - final CriteriaBuilder builder = em.getCriteriaBuilder(); - final CriteriaQuery criteria = builder.createQuery(Entity1.class); + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + final CriteriaQuery criteria = builder.createQuery( Entity1.class ); - final Root root = criteria.from(Entity1.class); - final Join entity2Join = root.join( Entity1_.entity2, JoinType.INNER); // illegal with fetch join + final Root root = criteria.from( Entity1.class ); + final Join entity2Join = root.join( Entity1_.entity2, + JoinType.INNER ); // illegal with fetch join - final Fetch entity2Fetch = root.fetch(Entity1_.entity2, JoinType.INNER); // <=== REMOVE - entity2Fetch.fetch( Entity2_.entity3 ); // <=== REMOVE + final Fetch entity2Fetch = root.fetch( Entity1_.entity2, JoinType.INNER ); // <=== REMOVE + entity2Fetch.fetch( Entity2_.entity3 ); // <=== REMOVE - criteria.where(builder.equal(root.get(Entity1_.value), "test"), - builder.equal(entity2Join.get(Entity2_.value), "test")); // illegal with fetch join + criteria.where( builder.equal( root.get( Entity1_.value ), "test" ), + builder.equal( entity2Join.get( Entity2_.value ), "test" ) ); // illegal with fetch join - em.createQuery(criteria).getResultList(); + entityManager.createQuery( criteria ).getResultList(); - em.getTransaction().commit(); - em.close(); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/PluralAttributeExpressionsTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/PluralAttributeExpressionsTest.java index 1bd1f4a73f02..1d801ea47fdd 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/PluralAttributeExpressionsTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/paths/PluralAttributeExpressionsTest.java @@ -4,8 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria.paths; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; @@ -13,52 +11,46 @@ import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; import org.hibernate.orm.test.jpa.metamodel.Address; import org.hibernate.orm.test.jpa.metamodel.Address_; import org.hibernate.orm.test.jpa.metamodel.Article; import org.hibernate.orm.test.jpa.metamodel.Article_; import org.hibernate.orm.test.jpa.metamodel.EntityWithMapEC; import org.hibernate.orm.test.jpa.metamodel.EntityWithMapEC_; +import org.hibernate.orm.test.jpa.metamodel.Phone; import org.hibernate.orm.test.jpa.metamodel.Translation; import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.hibernate.query.criteria.JpaExpression; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.Jira; +import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; /** * @author Steve Ebersole */ -public class PluralAttributeExpressionsTest extends AbstractMetamodelSpecificTest { - @Override - public Class[] getAnnotatedClasses() { - List classes = new ArrayList<>(); - Collections.addAll( classes, super.getAnnotatedClasses() ); - classes.add( EntityWithMapEC.class ); - classes.add( Article.class ); - classes.add( Translation.class ); - - return classes.toArray( new Class[ classes.size() ] ); - } +@Jpa(annotatedClasses = { + Address.class, Phone.class, EntityWithMapEC.class, Article.class, Translation.class +}) +public class PluralAttributeExpressionsTest { // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // IS [NOT] EMPTY @Test - public void testCollectionIsEmptyHql() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testCollectionIsEmptyHql(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { entityManager.createQuery( "select a from Address a where a.phones is empty" ).getResultList(); }); } @Test - public void testCollectionIsEmptyCriteria() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testCollectionIsEmptyCriteria(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery
criteria = cb.createQuery( Address.class ); @@ -73,16 +65,16 @@ public void testCollectionIsEmptyCriteria() { @Test @Jira("https://hibernate.atlassian.net/browse/HHH-11225") - public void testElementMapIsEmptyHql() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testElementMapIsEmptyHql(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { entityManager.createQuery( "select m from EntityWithMapEC m where m.elements is empty" ).getResultList(); }); } @Test @Jira("https://hibernate.atlassian.net/browse/HHH-11225") - public void testElementMapIsEmptyCriteria() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testElementMapIsEmptyCriteria(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery criteria = cb.createQuery( EntityWithMapEC.class ); @@ -97,16 +89,16 @@ public void testElementMapIsEmptyCriteria() { @Test @Jira("https://hibernate.atlassian.net/browse/HHH-11225") - public void testEntityMapIsEmptyHql() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testEntityMapIsEmptyHql(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { entityManager.createQuery( "select a from Article a where a.translations is empty" ).getResultList(); }); } @Test @Jira("https://hibernate.atlassian.net/browse/HHH-11225") - public void testEntityMapIsEmptyCriteria() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testEntityMapIsEmptyCriteria(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery
criteria = cb.createQuery( Article.class ); @@ -124,15 +116,15 @@ public void testEntityMapIsEmptyCriteria() { // SIZE @Test - public void testCollectionSizeHql() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testCollectionSizeHql(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { entityManager.createQuery( "select a from Address a where size(a.phones) > 1" ).getResultList(); }); } @Test - public void testCollectionSizeCriteria() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testCollectionSizeCriteria(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery
criteria = cb.createQuery( Address.class ); @@ -147,16 +139,16 @@ public void testCollectionSizeCriteria() { @Test @Jira("https://hibernate.atlassian.net/browse/HHH-11225") - public void testElementMapSizeHql() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testElementMapSizeHql(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { entityManager.createQuery( "select m from EntityWithMapEC m where size( m.elements ) > 1" ).getResultList(); }); } @Test @Jira("https://hibernate.atlassian.net/browse/HHH-11225") - public void testElementMapSizeCriteria() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testElementMapSizeCriteria(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery criteria = cb.createQuery( EntityWithMapEC.class ); @@ -171,16 +163,16 @@ public void testElementMapSizeCriteria() { @Test @Jira("https://hibernate.atlassian.net/browse/HHH-11225") - public void testEntityMapSizeHql() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testEntityMapSizeHql(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { entityManager.createQuery( "select a from Article a where size(a.translations) > 1" ).getResultList(); }); } @Test @Jira("https://hibernate.atlassian.net/browse/HHH-11225") - public void testEntityMapSizeCriteria() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testEntityMapSizeCriteria(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery
criteria = cb.createQuery( Article.class ); @@ -195,8 +187,8 @@ public void testEntityMapSizeCriteria() { @Test @Jira("https://hibernate.atlassian.net/browse/HHH-19126") - public void testPluralMapPathJavaType() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testPluralMapPathJavaType(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); final CriteriaQuery
criteria = cb.createQuery( Article.class ); @@ -209,8 +201,8 @@ public void testPluralMapPathJavaType() { @Test @Jira("https://hibernate.atlassian.net/browse/HHH-19126") - public void testPluralListPathJavaType() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testPluralListPathJavaType(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); final CriteriaQuery
criteria = cb.createQuery( Address.class ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/CorrelatedSubqueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/CorrelatedSubqueryTest.java index ae8de0121013..c7a86c059617 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/CorrelatedSubqueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/CorrelatedSubqueryTest.java @@ -4,128 +4,138 @@ */ package org.hibernate.orm.test.jpa.criteria.subquery; -import java.util.Set; - -import jakarta.persistence.EntityManager; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Join; import jakarta.persistence.criteria.Root; import jakarta.persistence.criteria.Subquery; - import org.hibernate.dialect.SybaseASEDialect; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; + +import org.hibernate.orm.test.jpa.metamodel.Address; +import org.hibernate.orm.test.jpa.metamodel.Alias; +import org.hibernate.orm.test.jpa.metamodel.Country; +import org.hibernate.orm.test.jpa.metamodel.CreditCard; import org.hibernate.orm.test.jpa.metamodel.Customer; import org.hibernate.orm.test.jpa.metamodel.Customer_; +import org.hibernate.orm.test.jpa.metamodel.Entity1; +import org.hibernate.orm.test.jpa.metamodel.Entity2; +import org.hibernate.orm.test.jpa.metamodel.Entity3; +import org.hibernate.orm.test.jpa.metamodel.Info; import org.hibernate.orm.test.jpa.metamodel.LineItem; import org.hibernate.orm.test.jpa.metamodel.LineItem_; import org.hibernate.orm.test.jpa.metamodel.Order; import org.hibernate.orm.test.jpa.metamodel.Order_; +import org.hibernate.orm.test.jpa.metamodel.Phone; +import org.hibernate.orm.test.jpa.metamodel.Product; +import org.hibernate.orm.test.jpa.metamodel.ShelfLife; +import org.hibernate.orm.test.jpa.metamodel.Spouse; +import org.hibernate.orm.test.jpa.metamodel.Thing; +import org.hibernate.orm.test.jpa.metamodel.ThingWithQuantity; +import org.hibernate.orm.test.jpa.metamodel.VersionedEntity; + +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; import org.hibernate.testing.orm.junit.SkipForDialect; import org.junit.jupiter.api.Test; +import java.util.Set; + import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author Steve Ebersole */ -public class CorrelatedSubqueryTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = { + Address.class, Alias.class, Country.class, CreditCard.class, Customer.class, + Entity1.class, Entity2.class, Entity3.class, + Info.class, LineItem.class, Order.class, Phone.class, Product.class, + ShelfLife.class, Spouse.class, Thing.class, ThingWithQuantity.class, + VersionedEntity.class +}) +public class CorrelatedSubqueryTest { @Test - public void testBasicCorrelation() { - CriteriaBuilder builder = entityManagerFactory().getCriteriaBuilder(); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaQuery criteria = builder.createQuery( Customer.class ); - Root customer = criteria.from( Customer.class ); - criteria.select( customer ); - Subquery orderSubquery = criteria.subquery( Order.class ); - Root customerCorrelationRoot = orderSubquery.correlate( customer ); - Join customerOrderCorrelationJoin = customerCorrelationRoot.join( Customer_.orders ); - orderSubquery.select( customerOrderCorrelationJoin ); - criteria.where( builder.not( builder.exists( orderSubquery ) ) ); - em.createQuery( criteria ).getResultList(); - - em.getTransaction().commit(); - em.close(); + public void testBasicCorrelation(EntityManagerFactoryScope scope) { + CriteriaBuilder builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( Customer.class ); + Root customer = criteria.from( Customer.class ); + criteria.select( customer ); + Subquery orderSubquery = criteria.subquery( Order.class ); + Root customerCorrelationRoot = orderSubquery.correlate( customer ); + Join customerOrderCorrelationJoin = customerCorrelationRoot.join( Customer_.orders ); + orderSubquery.select( customerOrderCorrelationJoin ); + criteria.where( builder.not( builder.exists( orderSubquery ) ) ); + entityManager.createQuery( criteria ).getResultList(); + } ); } @Test - public void testRestrictedCorrelation() { - CriteriaBuilder builder = entityManagerFactory().getCriteriaBuilder(); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaQuery criteria = builder.createQuery( Order.class ); - Root orderRoot = criteria.from( Order.class ); - criteria.select( orderRoot ); - // create correlated subquery - Subquery customerSubquery = criteria.subquery( Customer.class ); - Root orderRootCorrelation = customerSubquery.correlate( orderRoot ); - Join orderCustomerJoin = orderRootCorrelation.join( Order_.customer ); - customerSubquery.where( builder.like( orderCustomerJoin.get( Customer_.name ), "%Caruso" ) ) - .select( orderCustomerJoin ); - criteria.where( builder.exists( customerSubquery ) ); - em.createQuery( criteria ).getResultList(); - - em.getTransaction().commit(); - em.close(); + public void testRestrictedCorrelation(EntityManagerFactoryScope scope) { + CriteriaBuilder builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( Order.class ); + Root orderRoot = criteria.from( Order.class ); + criteria.select( orderRoot ); + // create correlated subquery + Subquery customerSubquery = criteria.subquery( Customer.class ); + Root orderRootCorrelation = customerSubquery.correlate( orderRoot ); + Join orderCustomerJoin = orderRootCorrelation.join( Order_.customer ); + customerSubquery.where( builder.like( orderCustomerJoin.get( Customer_.name ), "%Caruso" ) ) + .select( orderCustomerJoin ); + criteria.where( builder.exists( customerSubquery ) ); + entityManager.createQuery( criteria ).getResultList(); + } ); } @Test @JiraKey("HHH-3032") @SkipForDialect(dialectClass= SybaseASEDialect.class, majorVersion = 15) - public void testCorrelationExplicitSelectionCorrelation() { - CriteriaBuilder builder = entityManagerFactory().getCriteriaBuilder(); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaQuery customerCriteria = builder.createQuery( Customer.class ); - Root customer = customerCriteria.from( Customer.class ); - Join o = customer.join( Customer_.orders ); - Subquery sq = customerCriteria.subquery(Order.class); - Join sqo = sq.correlate(o); - Join sql = sqo.join(Order_.lineItems); - sq.where( builder.gt(sql.get( LineItem_.quantity), 3) ); - // use the correlation itself as the subquery selection (initially caused problems wrt aliases) - sq.select(sqo); - customerCriteria.select(customer).distinct(true); - customerCriteria.where(builder.exists(sq)); - em.createQuery( customerCriteria ).getResultList(); - - em.getTransaction().commit(); - em.close(); + public void testCorrelationExplicitSelectionCorrelation(EntityManagerFactoryScope scope) { + CriteriaBuilder builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + + scope.inTransaction( entityManager -> { + CriteriaQuery customerCriteria = builder.createQuery( Customer.class ); + Root customer = customerCriteria.from( Customer.class ); + Join o = customer.join( Customer_.orders ); + Subquery sq = customerCriteria.subquery( Order.class ); + Join sqo = sq.correlate( o ); + Join sql = sqo.join( Order_.lineItems ); + sq.where( builder.gt( sql.get( LineItem_.quantity ), 3 ) ); + // use the correlation itself as the subquery selection (initially caused problems wrt aliases) + sq.select( sqo ); + customerCriteria.select( customer ).distinct( true ); + customerCriteria.where( builder.exists( sq ) ); + entityManager.createQuery( customerCriteria ).getResultList(); + } ); } @Test - public void testRestrictedCorrelationNoExplicitSelection() { - CriteriaBuilder builder = entityManagerFactory().getCriteriaBuilder(); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaQuery criteria = builder.createQuery( Order.class ); - Root orderRoot = criteria.from( Order.class ); - criteria.select( orderRoot ); - // create correlated subquery - Subquery customerSubquery = criteria.subquery( Customer.class ); - Root orderRootCorrelation = customerSubquery.correlate( orderRoot ); - Join orderCustomerJoin = orderRootCorrelation.join( "customer" ); - customerSubquery.where( builder.like( orderCustomerJoin.get( "name" ), "%Caruso" ) ); - criteria.where( builder.exists( customerSubquery ) ); - em.createQuery( criteria ).getResultList(); - - em.getTransaction().commit(); - em.close(); + public void testRestrictedCorrelationNoExplicitSelection(EntityManagerFactoryScope scope) { + CriteriaBuilder builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + + scope.inTransaction( entityManager -> { + CriteriaQuery criteria = builder.createQuery( Order.class ); + Root orderRoot = criteria.from( Order.class ); + criteria.select( orderRoot ); + // create correlated subquery + Subquery customerSubquery = criteria.subquery( Customer.class ); + Root orderRootCorrelation = customerSubquery.correlate( orderRoot ); + Join orderCustomerJoin = orderRootCorrelation.join( "customer" ); + customerSubquery.where( builder.like( orderCustomerJoin.get( "name" ), "%Caruso" ) ); + criteria.where( builder.exists( customerSubquery ) ); + entityManager.createQuery( criteria ).getResultList(); + } ); } @Test @JiraKey(value = "HHH-8556") - public void testCorrelatedJoinsFromSubquery() { - CriteriaBuilder builder = entityManagerFactory().getCriteriaBuilder(); + public void testCorrelatedJoinsFromSubquery(EntityManagerFactoryScope scope) { + CriteriaBuilder builder = scope.getEntityManagerFactory().getCriteriaBuilder(); CriteriaQuery cquery = builder.createQuery(Customer.class); Root customer = cquery.from(Customer.class); cquery.select(customer); @@ -135,11 +145,6 @@ public void testCorrelatedJoinsFromSubquery() { Set> cJoins = sq.getCorrelatedJoins(); // ensure the join is returned in #getCorrelatedJoins - assertEquals( cJoins.size(), 1); - } - - @Test - public void testVariousSubqueryJoinSemantics() { - // meant to assert semantics of #getJoins versus #getCorrelatedJoins + assertEquals( 1, cJoins.size() ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/UncorrelatedSubqueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/UncorrelatedSubqueryTest.java index f5dd73af696a..042b496da79b 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/UncorrelatedSubqueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/UncorrelatedSubqueryTest.java @@ -4,109 +4,115 @@ */ package org.hibernate.orm.test.jpa.criteria.subquery; -import jakarta.persistence.EntityManager; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Join; import jakarta.persistence.criteria.Root; import jakarta.persistence.criteria.Subquery; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; +import org.hibernate.orm.test.jpa.metamodel.Address; +import org.hibernate.orm.test.jpa.metamodel.Alias; +import org.hibernate.orm.test.jpa.metamodel.Country; +import org.hibernate.orm.test.jpa.metamodel.CreditCard; import org.hibernate.orm.test.jpa.metamodel.Customer; import org.hibernate.orm.test.jpa.metamodel.Customer_; +import org.hibernate.orm.test.jpa.metamodel.Info; +import org.hibernate.orm.test.jpa.metamodel.LineItem; import org.hibernate.orm.test.jpa.metamodel.Order; import org.hibernate.orm.test.jpa.metamodel.Order_; +import org.hibernate.orm.test.jpa.metamodel.Phone; +import org.hibernate.orm.test.jpa.metamodel.Product; +import org.hibernate.orm.test.jpa.metamodel.ShelfLife; +import org.hibernate.orm.test.jpa.metamodel.Spouse; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * @author Steve Ebersole */ -public class UncorrelatedSubqueryTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = { + Address.class, Alias.class, Country.class, CreditCard.class, Customer.class, + Info.class, LineItem.class, Order.class, Phone.class, Product.class, + ShelfLife.class, Spouse.class +}) +public class UncorrelatedSubqueryTest { @Test - public void testGetCorrelatedParentIllegalStateException() { + public void testGetCorrelatedParentIllegalStateException(EntityManagerFactoryScope scope) { // test that attempting to call getCorrelatedParent on a uncorrelated query/subquery // throws ISE - CriteriaBuilder builder = entityManagerFactory().getCriteriaBuilder(); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaQuery criteria = builder.createQuery( Customer.class ); - Root customerRoot = criteria.from( Customer.class ); - Join orderJoin = customerRoot.join( Customer_.orders ); - criteria.select( customerRoot ); - Subquery subCriteria = criteria.subquery( Double.class ); - Root subqueryOrderRoot = subCriteria.from( Order.class ); - subCriteria.select( builder.min( subqueryOrderRoot.get( Order_.totalPrice ) ) ); - criteria.where( builder.equal( orderJoin.get( "totalPrice" ), builder.all( subCriteria ) ) ); - - assertFalse( customerRoot.isCorrelated() ); - assertFalse( subqueryOrderRoot.isCorrelated() ); - - try { - customerRoot.getCorrelationParent(); - fail( "Should have resulted in IllegalStateException" ); - } - catch (IllegalStateException expected) { - } - - try { - subqueryOrderRoot.getCorrelationParent(); - fail( "Should have resulted in IllegalStateException" ); - } - catch (IllegalStateException expected) { - } - - em.getTransaction().commit(); - em.close(); + CriteriaBuilder builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + scope.inTransaction( entityManager -> { + + CriteriaQuery criteria = builder.createQuery( Customer.class ); + Root customerRoot = criteria.from( Customer.class ); + Join orderJoin = customerRoot.join( Customer_.orders ); + criteria.select( customerRoot ); + Subquery subCriteria = criteria.subquery( Double.class ); + Root subqueryOrderRoot = subCriteria.from( Order.class ); + subCriteria.select( builder.min( subqueryOrderRoot.get( Order_.totalPrice ) ) ); + criteria.where( builder.equal( orderJoin.get( "totalPrice" ), builder.all( subCriteria ) ) ); + + assertFalse( customerRoot.isCorrelated() ); + assertFalse( subqueryOrderRoot.isCorrelated() ); + + assertThrows( + IllegalStateException.class, + customerRoot::getCorrelationParent, + "Should have resulted in IllegalStateException" + ); + + assertThrows( + IllegalStateException.class, + subqueryOrderRoot::getCorrelationParent, + "Should have resulted in IllegalStateException" + ); + } ); } @Test - public void testEqualAll() { - CriteriaBuilder builder = entityManagerFactory().getCriteriaBuilder(); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaQuery criteria = builder.createQuery( Customer.class ); - Root customerRoot = criteria.from( Customer.class ); - Join orderJoin = customerRoot.join( Customer_.orders ); - criteria.select( customerRoot ); - Subquery subCriteria = criteria.subquery( Double.class ); - Root subqueryOrderRoot = subCriteria.from( Order.class ); - subCriteria.select( builder.min( subqueryOrderRoot.get( Order_.totalPrice ) ) ); - criteria.where( builder.equal( orderJoin.get( "totalPrice" ), builder.all( subCriteria ) ) ); - em.createQuery( criteria ).getResultList(); - - em.getTransaction().commit(); - em.close(); + public void testEqualAll(EntityManagerFactoryScope scope) { + CriteriaBuilder builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + scope.inTransaction( entityManager -> { + + CriteriaQuery criteria = builder.createQuery( Customer.class ); + Root customerRoot = criteria.from( Customer.class ); + Join orderJoin = customerRoot.join( Customer_.orders ); + criteria.select( customerRoot ); + Subquery subCriteria = criteria.subquery( Double.class ); + Root subqueryOrderRoot = subCriteria.from( Order.class ); + subCriteria.select( builder.min( subqueryOrderRoot.get( Order_.totalPrice ) ) ); + criteria.where( builder.equal( orderJoin.get( "totalPrice" ), builder.all( subCriteria ) ) ); + entityManager.createQuery( criteria ).getResultList(); + + } ); } @Test - public void testLessThan() { - CriteriaBuilder builder = entityManagerFactory().getCriteriaBuilder(); - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaQuery criteria = builder.createQuery( Customer.class ); - Root customerRoot = criteria.from( Customer.class ); - - Subquery subCriteria = criteria.subquery( Double.class ); - Root subQueryCustomerRoot = subCriteria.from( Customer.class ); - subCriteria.select( builder.avg( subQueryCustomerRoot.get( Customer_.age ) ) ); - - criteria.where( - builder.lessThan( - customerRoot.get( Customer_.age ), - subCriteria.getSelection().as( Integer.class ) - ) - ); - em.createQuery( criteria ).getResultList(); - - em.getTransaction().commit(); - em.close(); + public void testLessThan(EntityManagerFactoryScope scope) { + CriteriaBuilder builder = scope.getEntityManagerFactory().getCriteriaBuilder(); + scope.inTransaction( entityManager -> { + + CriteriaQuery criteria = builder.createQuery( Customer.class ); + Root customerRoot = criteria.from( Customer.class ); + + Subquery subCriteria = criteria.subquery( Double.class ); + Root subQueryCustomerRoot = subCriteria.from( Customer.class ); + subCriteria.select( builder.avg( subQueryCustomerRoot.get( Customer_.age ) ) ); + + criteria.where( + builder.lessThan( + customerRoot.get( Customer_.age ), + subCriteria.getSelection().as( Integer.class ) + ) + ); + entityManager.createQuery( criteria ).getResultList(); + + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/tuple/TupleCriteriaTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/tuple/TupleCriteriaTest.java index d4a1ac8f6659..9690765414d8 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/tuple/TupleCriteriaTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/tuple/TupleCriteriaTest.java @@ -6,7 +6,6 @@ import java.util.Date; import java.util.List; -import jakarta.persistence.EntityManager; import jakarta.persistence.Tuple; import jakarta.persistence.criteria.CompoundSelection; import jakarta.persistence.criteria.CriteriaBuilder; @@ -14,239 +13,207 @@ import jakarta.persistence.criteria.Path; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; +import org.hibernate.orm.test.jpa.metamodel.Address; +import org.hibernate.orm.test.jpa.metamodel.Alias; +import org.hibernate.orm.test.jpa.metamodel.Country; +import org.hibernate.orm.test.jpa.metamodel.CreditCard; import org.hibernate.orm.test.jpa.metamodel.Customer; import org.hibernate.orm.test.jpa.metamodel.Customer_; +import org.hibernate.orm.test.jpa.metamodel.Info; +import org.hibernate.orm.test.jpa.metamodel.LineItem; +import org.hibernate.orm.test.jpa.metamodel.Order; +import org.hibernate.orm.test.jpa.metamodel.Phone; +import org.hibernate.orm.test.jpa.metamodel.Product; +import org.hibernate.orm.test.jpa.metamodel.ShelfLife; +import org.hibernate.orm.test.jpa.metamodel.Spouse; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; /** * @author Emmanuel Bernard */ -public class TupleCriteriaTest extends AbstractMetamodelSpecificTest { - - @Test - public void testArray() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - Customer c1 = new Customer(); - c1.setId( "c1" ); - c1.setAge( 18 ); - c1.setName( "Bob" ); - em.persist( c1 ); - em.getTransaction().commit(); - em.close(); - - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - final CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery q = cb.createQuery(Object[].class); - Root c = q.from(Customer.class); - q.select( cb.array( c.get(Customer_.name), c.get(Customer_.age) ) ); - List result = em.createQuery(q).getResultList(); - assertEquals( 1, result.size() ); - assertEquals( c1.getName(), result.get( 0 )[0] ); - assertEquals( c1.getAge(), result.get( 0 )[1] ); - em.getTransaction().commit(); - em.close(); - - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete Customer" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); +@Jpa(annotatedClasses = { + Address.class, Alias.class, Country.class, CreditCard.class, Customer.class, + Info.class, LineItem.class, Order.class, Phone.class, Product.class, + ShelfLife.class, Spouse.class +}) +public class TupleCriteriaTest { + + @AfterEach + public void tearDown(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testTuple() { - EntityManager em = entityManagerFactory().createEntityManager(); - - em.getTransaction().begin(); - Customer c1 = new Customer(); - c1.setId( "c1" ); - c1.setAge( 18 ); - c1.setName( "Bob" ); - em.persist( c1 ); - em.getTransaction().commit(); - em.close(); - - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - final CriteriaBuilder builder = em.getCriteriaBuilder(); - CriteriaQuery criteria = builder.createTupleQuery(); - Root customerRoot = criteria.from( Customer.class ); - Path namePath = customerRoot.get( Customer_.name ); - Path agePath = customerRoot.get( Customer_.age ); - agePath.alias( "age" ); - criteria.multiselect( namePath, agePath ); - List results = em.createQuery( criteria ).getResultList(); - assertEquals( 1, results.size() ); - Object resultElement = results.get( 0 ); - assertTrue( Tuple.class.isInstance( resultElement ), "Check result 'row' as Tuple" ); - Tuple resultElementTuple = (Tuple) resultElement; - Object[] tupleArray = resultElementTuple.toArray(); - assertEquals( 2, tupleArray.length ); - assertEquals( tupleArray[0], resultElementTuple.get( 0 ) ); - assertEquals( resultElementTuple.get( namePath ), resultElementTuple.get( 0 ) ); - assertEquals( tupleArray[1], resultElementTuple.get( 1 ) ); - assertEquals( resultElementTuple.get( agePath ), resultElementTuple.get( 1 ) ); - assertEquals( resultElementTuple.get( agePath ), resultElementTuple.get( "age" ) ); - em.getTransaction().commit(); - em.close(); - - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete Customer" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + public void testArray(EntityManagerFactoryScope scope) { + final Customer c1 = new Customer(); + scope.inTransaction( entityManager -> { + c1.setId( "c1" ); + c1.setAge( 18 ); + c1.setName( "Bob" ); + entityManager.persist( c1 ); + } ); + scope.inTransaction( entityManager -> { + final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery q = cb.createQuery( Object[].class ); + Root c = q.from( Customer.class ); + q.select( cb.array( c.get( Customer_.name ), c.get( Customer_.age ) ) ); + List result = entityManager.createQuery( q ).getResultList(); + assertEquals( 1, result.size() ); + assertEquals( c1.getName(), result.get( 0 )[0] ); + assertEquals( c1.getAge(), result.get( 0 )[1] ); + } ); } @Test - public void testIllegalArgumentExceptionBuildingTupleWithSameAliases() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - final CriteriaBuilder builder = em.getCriteriaBuilder(); - CriteriaQuery criteria = builder.createTupleQuery(); - Root customerRoot = criteria.from( Customer.class ); - Path namePath = customerRoot.get( Customer_.name ); - namePath.alias( "age" ); - Path agePath = customerRoot.get( Customer_.age ); - agePath.alias( "age" ); - try { + public void testTuple(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + Customer c1 = new Customer(); + c1.setId( "c1" ); + c1.setAge( 18 ); + c1.setName( "Bob" ); + entityManager.persist( c1 ); + } ); + scope.inTransaction( entityManager -> { + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteria = builder.createTupleQuery(); + Root customerRoot = criteria.from( Customer.class ); + Path namePath = customerRoot.get( Customer_.name ); + Path agePath = customerRoot.get( Customer_.age ); + agePath.alias( "age" ); criteria.multiselect( namePath, agePath ); - fail( "Attempt to define multi-select with same aliases should have thrown IllegalArgumentException" ); - } - catch (IllegalArgumentException expected) { - } - em.getTransaction().commit(); - em.close(); + List results = entityManager.createQuery( criteria ).getResultList(); + assertEquals( 1, results.size() ); + Object resultElement = results.get( 0 ); + assertTrue( Tuple.class.isInstance( resultElement ), "Check result 'row' as Tuple" ); + Tuple resultElementTuple = (Tuple) resultElement; + Object[] tupleArray = resultElementTuple.toArray(); + assertEquals( 2, tupleArray.length ); + assertEquals( tupleArray[0], resultElementTuple.get( 0 ) ); + assertEquals( resultElementTuple.get( namePath ), resultElementTuple.get( 0 ) ); + assertEquals( tupleArray[1], resultElementTuple.get( 1 ) ); + assertEquals( resultElementTuple.get( agePath ), resultElementTuple.get( 1 ) ); + assertEquals( resultElementTuple.get( agePath ), resultElementTuple.get( "age" ) ); + } ); } @Test - public void testVariousTupleAccessMethods() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - Customer c1 = new Customer(); - c1.setId( "c1" ); - c1.setAge( 18 ); - c1.setName( "Bob" ); - em.persist( c1 ); - em.getTransaction().commit(); - em.close(); - - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - - final CriteriaBuilder builder = em.getCriteriaBuilder(); - CriteriaQuery criteria = builder.createTupleQuery(); - Root customerRoot = criteria.from( Customer.class ); - Path namePath = customerRoot.get( Customer_.name ); - namePath.alias( "NAME" ); - Path agePath = customerRoot.get( Customer_.age ); - agePath.alias( "AGE" ); - criteria.multiselect( namePath, agePath ); - - List results = em.createQuery( criteria ).getResultList(); - Tuple tuple = results.get( 0 ); - assertNotNull( tuple ); - assertNotNull( tuple.get( "NAME" ) ); - assertNotNull( tuple.get( "NAME", String.class ) ); - try { - tuple.get( "NAME", Date.class ); - fail( "Accessing Customer#name tuple as Date should have thrown exception" ); - } - catch (IllegalArgumentException expected) { - } - - em.getTransaction().commit(); - em.close(); - - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete Customer" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + public void testIllegalArgumentExceptionBuildingTupleWithSameAliases(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteria = builder.createTupleQuery(); + Root customerRoot = criteria.from( Customer.class ); + Path namePath = customerRoot.get( Customer_.name ); + namePath.alias( "age" ); + Path agePath = customerRoot.get( Customer_.age ); + agePath.alias( "age" ); + assertThrows( + IllegalArgumentException.class, + () -> criteria.multiselect( namePath, agePath ), + "Attempt to define multi-select with same aliases should have thrown IllegalArgumentException" + ); + } ); } @Test - public void testIllegalArgumentExceptionBuildingSelectArrayWithSameAliases() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - final CriteriaBuilder builder = em.getCriteriaBuilder(); - CriteriaQuery criteria = builder.createQuery(); - Root customerRoot = criteria.from( Customer.class ); - Path namePath = customerRoot.get( Customer_.name ); - Path agePath = customerRoot.get( Customer_.age ); - try { - CompoundSelection c = builder.array( namePath.alias( "SAME" ), agePath.alias( "SAME" ) ); - criteria.select( c ); - fail( "Attempt to define multi-select with same aliases should have thrown IllegalArgumentException" ); - } - catch (IllegalArgumentException expected) { - } - em.getTransaction().commit(); - em.close(); + public void testVariousTupleAccessMethods(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + Customer c1 = new Customer(); + c1.setId( "c1" ); + c1.setAge( 18 ); + c1.setName( "Bob" ); + entityManager.persist( c1 ); + } ); + + scope.inTransaction( entityManager -> { + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteria = builder.createTupleQuery(); + Root customerRoot = criteria.from( Customer.class ); + Path namePath = customerRoot.get( Customer_.name ); + namePath.alias( "NAME" ); + Path agePath = customerRoot.get( Customer_.age ); + agePath.alias( "AGE" ); + criteria.multiselect( namePath, agePath ); + + List results = entityManager.createQuery( criteria ).getResultList(); + Tuple tuple = results.get( 0 ); + assertNotNull( tuple ); + assertNotNull( tuple.get( "NAME" ) ); + assertNotNull( tuple.get( "NAME", String.class ) ); + assertThrows( + IllegalArgumentException.class, + () -> tuple.get( "NAME", Date.class ), + "Accessing Customer#name tuple as Date should have thrown exception" + ); + } ); } @Test - public void testInvalidTupleIndexAccess() { - EntityManager em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - Customer c1 = new Customer(); - c1.setId( "c1" ); - c1.setAge( 18 ); - c1.setName( "Bob" ); - em.persist( c1 ); - em.getTransaction().commit(); - em.close(); + public void testIllegalArgumentExceptionBuildingSelectArrayWithSameAliases(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteria = builder.createQuery(); + Root customerRoot = criteria.from( Customer.class ); + Path namePath = customerRoot.get( Customer_.name ); + Path agePath = customerRoot.get( Customer_.age ); + assertThrows( + IllegalArgumentException.class, + () -> { + CompoundSelection c = builder.array( namePath.alias( "SAME" ), agePath.alias( "SAME" ) ); + criteria.select( c ); + }, + "Attempt to define multi-select with same aliases should have thrown IllegalArgumentException" + ); + } ); + } + @Test + public void testInvalidTupleIndexAccess(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + Customer c1 = new Customer(); + c1.setId( "c1" ); + c1.setAge( 18 ); + c1.setName( "Bob" ); + entityManager.persist( c1 ); + } ); // the actual assertion block - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - final CriteriaBuilder builder = em.getCriteriaBuilder(); - CriteriaQuery criteria = builder.createTupleQuery(); - Root customerRoot = criteria.from( Customer.class ); - criteria.multiselect( customerRoot.get( Customer_.name ), customerRoot.get( Customer_.age ) ); - List results = em.createQuery( criteria ).getResultList(); - assertEquals( 1, results.size() ); - Tuple tuple = results.get( 0 ); - try { - tuple.get( 99 ); - fail( "99 is invalid index" ); - } - catch (IllegalArgumentException expected) { - } - - try { - tuple.get( 99, String.class ); - fail( "99 is invalid index" ); - } - catch (IllegalArgumentException expected) { - } - - tuple.get( 0, String.class ); - tuple.get( 1, Integer.class ); - - try { - tuple.get( 0, Date.class ); - fail( "Date is invalid type" ); - } - catch (IllegalArgumentException expected) { - } - - em.getTransaction().commit(); - em.close(); - - em = entityManagerFactory().createEntityManager(); - em.getTransaction().begin(); - em.createQuery( "delete Customer" ).executeUpdate(); - em.getTransaction().commit(); - em.close(); + scope.inTransaction( entityManager -> { + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteria = builder.createTupleQuery(); + Root customerRoot = criteria.from( Customer.class ); + criteria.multiselect( customerRoot.get( Customer_.name ), customerRoot.get( Customer_.age ) ); + List results = entityManager.createQuery( criteria ).getResultList(); + assertEquals( 1, results.size() ); + Tuple tuple = results.get( 0 ); + assertThrows( + IllegalArgumentException.class, + () -> tuple.get( 99 ), + "99 is invalid index" + ); + + assertThrows( + IllegalArgumentException.class, + () -> tuple.get( 99, String.class ), + "99 is invalid index" + ); + + tuple.get( 0, String.class ); + tuple.get( 1, Integer.class ); + + assertThrows( + IllegalArgumentException.class, + () -> tuple.get( 0, Date.class ), + "Date is invalid type" + ); + } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/tuple/TupleQueryRetrievePrimitiveTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/tuple/TupleQueryRetrievePrimitiveTest.java index 6de1198452b4..e845c4c109ef 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/tuple/TupleQueryRetrievePrimitiveTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/tuple/TupleQueryRetrievePrimitiveTest.java @@ -4,92 +4,85 @@ */ package org.hibernate.orm.test.jpa.criteria.tuple; -import org.hibernate.orm.test.jpa.metamodel.AbstractMetamodelSpecificTest; +import jakarta.persistence.Tuple; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Path; +import jakarta.persistence.criteria.Root; + import org.hibernate.orm.test.jpa.metamodel.ThingWithQuantity; import org.hibernate.orm.test.jpa.metamodel.ThingWithQuantity_; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import static org.junit.jupiter.api.Assertions.assertEquals; - +import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import jakarta.persistence.EntityManager; -import jakarta.persistence.Tuple; -import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.CriteriaQuery; -import jakarta.persistence.criteria.Path; -import jakarta.persistence.criteria.Root; +import static org.junit.jupiter.api.Assertions.assertEquals; @JiraKey( value = "HHH-15454" ) -public class TupleQueryRetrievePrimitiveTest extends AbstractMetamodelSpecificTest { +@Jpa(annotatedClasses = {ThingWithQuantity.class}) +public class TupleQueryRetrievePrimitiveTest { public static final int QUANTITY_OF_THING = 3; public static final String THING_WITH_QUANTITY_3_ID = "thingWithQuantity3"; - private EntityManager em; - @BeforeEach - public void createThingWithQuantity() { - em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - ThingWithQuantity thing = new ThingWithQuantity(); - thing.setId( THING_WITH_QUANTITY_3_ID ); - thing.setName( "3 Things" ); - thing.setQuantity(QUANTITY_OF_THING); - em.persist( thing ); - - em.getTransaction().commit(); + public void createThingWithQuantity(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + ThingWithQuantity thing = new ThingWithQuantity(); + thing.setId( THING_WITH_QUANTITY_3_ID ); + thing.setName( "3 Things" ); + thing.setQuantity( QUANTITY_OF_THING ); + entityManager.persist( thing ); + } ); } @AfterEach - public void endEntityManager() { - em.getTransaction().begin(); - em.remove( em.find( ThingWithQuantity.class, THING_WITH_QUANTITY_3_ID ) ); - em.getTransaction().commit(); - em.close(); + public void endEntityManager(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test - public void testRetrieveTupleEntryWithPrimitiveType() { - final Tuple result = queryTuple(); + public void testRetrieveTupleEntryWithPrimitiveType(EntityManagerFactoryScope scope) { + final Tuple result = queryTuple(scope); final int quantity = result.get(ThingWithQuantity_.quantity.getName(), int.class); assertEquals(QUANTITY_OF_THING, quantity); } @Test - public void testRetrieveTupleEntryWithMetadata() { - final Tuple result = queryTuple(); + public void testRetrieveTupleEntryWithMetadata(EntityManagerFactoryScope scope) { + final Tuple result = queryTuple(scope); final int quantity = result.get( ThingWithQuantity_.quantity.getName(), ThingWithQuantity_.quantity.getJavaType()); assertEquals(QUANTITY_OF_THING, quantity); } @Test - public void testRetrieveTupleEntryFromIndex() { - final Tuple result = queryTuple(); + public void testRetrieveTupleEntryFromIndex(EntityManagerFactoryScope scope) { + final Tuple result = queryTuple(scope); final int quantity = result.get(0, ThingWithQuantity_.quantity.getJavaType()); assertEquals(QUANTITY_OF_THING, quantity); } @Test - public void testRetrieveTupleEntryWithTupleElement() { - final CriteriaBuilder cb = em.getCriteriaBuilder(); + public void testRetrieveTupleEntryWithTupleElement(EntityManagerFactoryScope scope) { + final CriteriaBuilder cb = scope.getEntityManagerFactory().getCriteriaBuilder(); final CriteriaQuery query = cb.createTupleQuery(); final Root thingWithQuantity = query.from( ThingWithQuantity.class); final Path tupleElement = thingWithQuantity.get( ThingWithQuantity_.quantity); query.multiselect(tupleElement.alias(ThingWithQuantity_.quantity.getName())); - Tuple result = em.createQuery(query).setMaxResults(1).getSingleResult(); + Tuple result = scope.fromEntityManager( entityManager -> entityManager.createQuery(query).setMaxResults(1).getSingleResult() ); final int quantity = result.get(tupleElement); assertEquals(QUANTITY_OF_THING, quantity); } - private Tuple queryTuple() { - final CriteriaBuilder cb = em.getCriteriaBuilder(); + private Tuple queryTuple(EntityManagerFactoryScope scope) { + final CriteriaBuilder cb = scope.getEntityManagerFactory().getCriteriaBuilder(); final CriteriaQuery query = cb.createTupleQuery(); final Root thingWithQuantity = query.from(ThingWithQuantity.class); query.multiselect(thingWithQuantity.get(ThingWithQuantity_.quantity).alias(ThingWithQuantity_.quantity.getName())); - return em.createQuery(query).setMaxResults(1).getSingleResult(); + return scope.fromEntityManager( entityManager -> entityManager.createQuery(query).setMaxResults(1).getSingleResult() ); } } From 45b2ca04930eefad7aad6522b2ba3f1b520646a8 Mon Sep 17 00:00:00 2001 From: Jan Schatteman Date: Tue, 28 Oct 2025 19:42:12 +0100 Subject: [PATCH 5/6] HHH-19846 - Drop JUnit 4 usage: org.hibernate.orm.test.jpa.criteria - WIP Signed-off-by: Jan Schatteman --- ...stractCriteriaLiteralHandlingModeTest.java | 39 ++++++++++--------- .../CriteriaLiteralHandlingModeAutoTest.java | 3 +- .../CriteriaLiteralHandlingModeBindTest.java | 2 +- ...dlingModeInlineShortNameLowercaseTest.java | 2 +- ...dlingModeInlineShortNameUppercaseTest.java | 2 +- ...CriteriaLiteralHandlingModeInlineTest.java | 2 +- ...CriteriaLiteralHandlingModeInlineTest.java | 4 +- 7 files changed, 28 insertions(+), 26 deletions(-) diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/AbstractCriteriaLiteralHandlingModeTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/AbstractCriteriaLiteralHandlingModeTest.java index 4e7d83d070ed..e8caf0cd2233 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/AbstractCriteriaLiteralHandlingModeTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/AbstractCriteriaLiteralHandlingModeTest.java @@ -4,39 +4,42 @@ */ package org.hibernate.orm.test.jpa.criteria.literal; -import java.util.List; -import java.util.Map; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Tuple; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; - import org.hibernate.cfg.AvailableSettings; import org.hibernate.engine.jdbc.Size; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; -import org.hibernate.query.sqm.CastType; +import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.query.criteria.HibernateCriteriaBuilder; +import org.hibernate.query.sqm.CastType; +import org.hibernate.testing.jdbc.SQLStatementInspector; +import org.hibernate.testing.orm.junit.DialectContext; +import org.hibernate.testing.orm.junit.EntityManagerFactoryBasedFunctionalTest; import org.hibernate.type.SqlTypes; import org.hibernate.type.spi.TypeConfiguration; -import org.hibernate.testing.jdbc.SQLStatementInterceptor; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author Vlad Mihalcea */ -public abstract class AbstractCriteriaLiteralHandlingModeTest extends BaseEntityManagerFunctionalTestCase { +public abstract class AbstractCriteriaLiteralHandlingModeTest extends EntityManagerFactoryBasedFunctionalTest { - private SQLStatementInterceptor sqlStatementInterceptor; + private SQLStatementInspector sqlStatementInspector; @Override protected void addConfigOptions(Map options) { - sqlStatementInterceptor = new SQLStatementInterceptor( options ); + sqlStatementInspector = new SQLStatementInspector(); + options.put( AvailableSettings.STATEMENT_INSPECTOR, sqlStatementInspector ); options.put( AvailableSettings.DIALECT_NATIVE_PARAM_MARKERS, Boolean.FALSE ); } @@ -47,7 +50,7 @@ protected Class[] getAnnotatedClasses() { }; } - @Before + @BeforeEach public void init() { doInJPA( this::entityManagerFactory, entityManager -> { Book book = new Book(); @@ -59,7 +62,7 @@ public void init() { } @Test - public void testLiteralHandlingMode() throws Exception { + public void testLiteralHandlingMode() { doInJPA( this::entityManagerFactory, entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery query = cb.createQuery( Tuple.class ); @@ -83,18 +86,18 @@ public void testLiteralHandlingMode() throws Exception { entity.get( "name" ) ); - sqlStatementInterceptor.clear(); + sqlStatementInspector.clear(); List tuples = entityManager.createQuery( query ).getResultList(); assertEquals( 1, tuples.size() ); - sqlStatementInterceptor.assertExecuted( expectedSQL() ); + sqlStatementInspector.assertExecuted( expectedSQL() ); } ); } protected String casted(String expression, CastType castType) { - final TypeConfiguration typeConfiguration = entityManagerFactory().getTypeConfiguration(); - return getDialect().castPattern( CastType.OTHER, castType ) + final TypeConfiguration typeConfiguration = entityManagerFactory().unwrap( SessionFactoryImplementor.class ).getTypeConfiguration(); + return DialectContext.getDialect().castPattern( CastType.OTHER, castType ) .replace( "?2", typeConfiguration.getDdlTypeRegistry().getDescriptor( SqlTypes.VARCHAR ) diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeAutoTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeAutoTest.java index 59f401c8bb1b..49e1944cc899 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeAutoTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeAutoTest.java @@ -7,8 +7,7 @@ import org.hibernate.dialect.H2Dialect; import org.hibernate.query.sqm.CastType; -import org.hibernate.testing.RequiresDialect; - +import org.hibernate.testing.orm.junit.RequiresDialect; /** * @author Vlad Mihalcea diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeBindTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeBindTest.java index 01e5517a9499..a00551b930ce 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeBindTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeBindTest.java @@ -11,7 +11,7 @@ import org.hibernate.query.sqm.CastType; import org.hibernate.query.criteria.ValueHandlingMode; -import org.hibernate.testing.RequiresDialect; +import org.hibernate.testing.orm.junit.RequiresDialect; /** * @author Vlad Mihalcea diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeInlineShortNameLowercaseTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeInlineShortNameLowercaseTest.java index 7b457e23e67f..77df75377ebe 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeInlineShortNameLowercaseTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeInlineShortNameLowercaseTest.java @@ -9,7 +9,7 @@ import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.H2Dialect; -import org.hibernate.testing.RequiresDialect; +import org.hibernate.testing.orm.junit.RequiresDialect; /** * @author Vlad Mihalcea diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeInlineShortNameUppercaseTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeInlineShortNameUppercaseTest.java index c6cdf1d9cb98..95b778037cf0 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeInlineShortNameUppercaseTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeInlineShortNameUppercaseTest.java @@ -9,7 +9,7 @@ import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.H2Dialect; -import org.hibernate.testing.RequiresDialect; +import org.hibernate.testing.orm.junit.RequiresDialect; /** * @author Vlad Mihalcea diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeInlineTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeInlineTest.java index c18351b7bfac..c7ed2c096060 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeInlineTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/CriteriaLiteralHandlingModeInlineTest.java @@ -10,7 +10,7 @@ import org.hibernate.dialect.H2Dialect; import org.hibernate.query.criteria.ValueHandlingMode; -import org.hibernate.testing.RequiresDialect; +import org.hibernate.testing.orm.junit.RequiresDialect; /** * @author Vlad Mihalcea diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/MySQLCriteriaLiteralHandlingModeInlineTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/MySQLCriteriaLiteralHandlingModeInlineTest.java index fbba26422384..8fd90d9ec9b2 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/MySQLCriteriaLiteralHandlingModeInlineTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/literal/MySQLCriteriaLiteralHandlingModeInlineTest.java @@ -10,12 +10,12 @@ import org.hibernate.dialect.MySQLDialect; import org.hibernate.query.criteria.ValueHandlingMode; -import org.hibernate.testing.RequiresDialect; +import org.hibernate.testing.orm.junit.RequiresDialect; /** * @author Vlad Mihalcea */ -@RequiresDialect(MySQLDialect.class) +@RequiresDialect(value = MySQLDialect.class) public class MySQLCriteriaLiteralHandlingModeInlineTest extends AbstractCriteriaLiteralHandlingModeTest { @Override From 9b7e5f5c21e43c94ad08f63988910862f2777ece Mon Sep 17 00:00:00 2001 From: Jan Schatteman Date: Wed, 29 Oct 2025 00:14:08 +0100 Subject: [PATCH 6/6] HHH-19846 - Drop JUnit 4 usage: org.hibernate.orm.test.jpa.criteria Signed-off-by: Jan Schatteman --- .../jpa/criteria/AbstractCriteriaTest.java | 53 --- .../orm/test/jpa/criteria/CoalesceTest.java | 4 +- .../jpa/criteria/CriteriaCompilingTest.java | 111 +++-- .../criteria/CriteriaQualifiedJoinTest.java | 2 +- .../CriteriaQueryTypeQueryAdapterTest.java | 215 +++++---- ...ithDynamicInstantiationAndOrderByTest.java | 2 +- .../EntitySuperclassCollectionTest.java | 76 ++-- ...tityUseJoinedSubclassOptimizationTest.java | 24 +- .../EntityUseSingleTableOptimizationTest.java | 24 +- ...ntityUseUnionSubclassOptimizationTest.java | 24 +- .../orm/test/jpa/criteria/GroupByTest.java | 12 +- .../orm/test/jpa/criteria/OnKeywordTest.java | 39 +- .../orm/test/jpa/criteria/ParameterTest.java | 4 +- .../test/jpa/criteria/PowerFunctionTest.java | 4 +- .../test/jpa/criteria/QueryBuilderTest.java | 420 +++++++++--------- ...ryPredicateAndParameterComparableTest.java | 2 +- .../criteria/SelectOnlyArrayPropertyTest.java | 26 +- .../criteria/SuperclassCollectionTest.java | 86 ++-- .../orm/test/jpa/criteria/TreatJoinTest.java | 76 ++-- .../test/jpa/criteria/TreatListJoinTest.java | 59 +-- .../criteria/mapjoin/MapJoinEntryTest.java | 54 +-- ...le.java => MapJoinWithEmbeddableTest.java} | 34 +- ...CriteriaLiteralInSelectExpressionTest.java | 2 +- .../nulliteral/CriteriaLiteralsTest.java | 148 +++--- .../criteria/query/LimitExpressionTest.java | 44 +- .../SelectCaseLiteralHandlingBindTest.java | 51 +-- .../criteria/selectcase/SelectCaseTest.java | 111 +++-- .../simplecase/BasicSimpleCaseTest.java | 270 +++++------ .../AbstractSubqueryInSelectClauseTest.java | 35 +- ...bqueryInSelectClauseJpaComplianceTest.java | 59 +-- .../subquery/SubqueryInSelectClauseTest.java | 22 +- .../subquery/UncorrelatedSubqueryTest.java | 2 +- .../inline/DateCompositeCustomTypeTest.java | 6 +- .../inline/EntityGraphTest.java | 6 +- .../inline/EqualityComparisonTest.java | 41 +- .../inline/ExpressionsTest.java | 28 +- ...le.java => MapJoinWithEmbeddableTest.java} | 46 +- ...ciationEqualityPredicateParameterTest.java | 4 +- ...NonPkAssociationEqualityPredicateTest.java | 4 +- .../inline/PredicateTest.java | 4 +- .../inline/SubQueryTest.java | 2 +- 41 files changed, 1086 insertions(+), 1150 deletions(-) delete mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/AbstractCriteriaTest.java rename hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/mapjoin/{MapJoinTestWithEmbeddable.java => MapJoinWithEmbeddableTest.java} (77%) rename hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/{MapJoinTestWithEmbeddable.java => MapJoinWithEmbeddableTest.java} (87%) diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/AbstractCriteriaTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/AbstractCriteriaTest.java deleted file mode 100644 index 2b8a352e2708..000000000000 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/AbstractCriteriaTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.orm.test.jpa.criteria; - -import org.hibernate.orm.test.jpa.metamodel.Address; -import org.hibernate.orm.test.jpa.metamodel.Alias; -import org.hibernate.orm.test.jpa.metamodel.Country; -import org.hibernate.orm.test.jpa.metamodel.CreditCard; -import org.hibernate.orm.test.jpa.metamodel.Customer; -import org.hibernate.orm.test.jpa.metamodel.Entity1; -import org.hibernate.orm.test.jpa.metamodel.Entity2; -import org.hibernate.orm.test.jpa.metamodel.Entity3; -import org.hibernate.orm.test.jpa.metamodel.Info; -import org.hibernate.orm.test.jpa.metamodel.LineItem; -import org.hibernate.orm.test.jpa.metamodel.Order; -import org.hibernate.orm.test.jpa.metamodel.Phone; -import org.hibernate.orm.test.jpa.metamodel.Product; -import org.hibernate.orm.test.jpa.metamodel.ShelfLife; -import org.hibernate.orm.test.jpa.metamodel.Spouse; -import org.hibernate.orm.test.jpa.metamodel.Thing; -import org.hibernate.orm.test.jpa.metamodel.ThingWithQuantity; -import org.hibernate.orm.test.jpa.metamodel.VersionedEntity; - -import org.hibernate.testing.orm.junit.Jpa; - -/** - * @author Jan Schatteman - */ - -@Jpa(annotatedClasses = { - Address.class, - Alias.class, - Country.class, - CreditCard.class, - Customer.class, - Entity1.class, - Entity2.class, - Entity3.class, - Info.class, - LineItem.class, - Order.class, - Phone.class, - Product.class, - ShelfLife.class, - Spouse.class, - Thing.class, - ThingWithQuantity.class, - VersionedEntity.class -}) -public abstract class AbstractCriteriaTest { -} diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CoalesceTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CoalesceTest.java index bd0a515561f5..1b3fd5d2d4d4 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CoalesceTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CoalesceTest.java @@ -50,7 +50,7 @@ public void hhh15291JPQL1Test(EntityManagerFactoryScope scope) { scope.inEntityManager( entityManager -> { TypedQuery query = entityManager.createQuery( - "" + "SELECT t FROM HHH15291Entity t " + "SELECT t FROM HHH15291Entity t " + "WHERE t.itemString2 = " + "COALESCE (t.itemString1, ?1)", HHH15291Entity.class ); @@ -67,7 +67,7 @@ public void hhh15291JPQL2Test(EntityManagerFactoryScope scope) { scope.inEntityManager( entityManager -> { TypedQuery query2 = entityManager.createQuery( - "" + "SELECT COALESCE (t.itemString2, ?1) FROM HHH15291Entity t ORDER BY t.itemInteger1 ASC", + "SELECT COALESCE (t.itemString2, ?1) FROM HHH15291Entity t ORDER BY t.itemInteger1 ASC", String.class ); query2.setParameter( 1, "Sample" ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CriteriaCompilingTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CriteriaCompilingTest.java index 47098ad2c141..089c615df512 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CriteriaCompilingTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CriteriaCompilingTest.java @@ -21,7 +21,6 @@ import org.hibernate.query.Query; import org.hibernate.ScrollMode; import org.hibernate.Session; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; import org.hibernate.orm.test.jpa.callbacks.RemoteControl; import org.hibernate.orm.test.jpa.callbacks.Television; import org.hibernate.orm.test.jpa.callbacks.VideoSystem; @@ -40,47 +39,47 @@ import org.hibernate.orm.test.jpa.metamodel.ShelfLife; import org.hibernate.orm.test.jpa.metamodel.Spouse; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.hibernate.testing.transaction.TransactionUtil; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author Steve Ebersole */ -public class CriteriaCompilingTest extends BaseEntityManagerFunctionalTestCase { - @Override - public Class[] getAnnotatedClasses() { - return new Class[] { - Customer.class, - Alias.class, - Phone.class, - Address.class, - Country.class, - CreditCard.class, - Info.class, - Spouse.class, - LineItem.class, - Order.class, - Product.class, - ShelfLife.class, - // @Inheritance - Fruit.class, - Strawberry.class, - // @MappedSuperclass - VideoSystem.class, - Television.class, - RemoteControl.class - }; - } - - @Before - public void setUp(){ - TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> { +@Jpa(annotatedClasses = { + Customer.class, + Alias.class, + Phone.class, + Address.class, + Country.class, + CreditCard.class, + Info.class, + Spouse.class, + LineItem.class, + Order.class, + Product.class, + ShelfLife.class, + // @Inheritance + Fruit.class, + Strawberry.class, + // @MappedSuperclass + VideoSystem.class, + Television.class, + RemoteControl.class +}) +public class CriteriaCompilingTest { + + @BeforeEach + public void setUp(EntityManagerFactoryScope scope){ + scope.inTransaction( entityManager -> { Customer customer = new Customer(); customer.setId( "id" ); customer.setName( " David R. Vincent " ); @@ -92,11 +91,16 @@ public void setUp(){ } ); } + @AfterEach + public void cleanupTestData(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); + } + @Test - public void testTrim() { + public void testTrim(EntityManagerFactoryScope scope) { final String expectedResult = "David R. Vincent"; - TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); @@ -122,14 +126,14 @@ public void testTrim() { TypedQuery tq = entityManager.createQuery( cquery ); String result = tq.getSingleResult(); - Assert.assertEquals( "Mismatch in received results", expectedResult, result ); + assertEquals( expectedResult, result, "Mismatch in received results" ); } ); } @Test @JiraKey(value = "HHH-11393") - public void testTrimAChar() { - TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> { + public void testTrimAChar(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); final CriteriaQuery query = criteriaBuilder.createQuery( Customer.class ); final Root from = query.from( Customer.class ); @@ -146,8 +150,8 @@ public void testTrimAChar() { } @Test - public void testJustSimpleRootCriteria() { - TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> { + public void testJustSimpleRootCriteria(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { // First w/o explicit selection... CriteriaQuery criteria = entityManager.getCriteriaBuilder().createQuery( Customer.class ); criteria.from( Customer.class ); @@ -162,8 +166,8 @@ public void testJustSimpleRootCriteria() { } @Test - public void testSimpleJoinCriteria() { - TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> { + public void testSimpleJoinCriteria(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { // String based... CriteriaQuery criteria = entityManager.getCriteriaBuilder().createQuery( Order.class ); @@ -175,8 +179,8 @@ public void testSimpleJoinCriteria() { } @Test - public void testSimpleFetchCriteria() { - TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> { + public void testSimpleFetchCriteria(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { // String based... CriteriaQuery criteria = entityManager.getCriteriaBuilder().createQuery( Order.class ); @@ -188,8 +192,8 @@ public void testSimpleFetchCriteria() { } @Test - public void testSerialization() { - TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> { + public void testSerialization(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaQuery criteria = entityManager.getCriteriaBuilder().createQuery( Order.class ); Root root = criteria.from( Order.class ); @@ -204,8 +208,8 @@ public void testSerialization() { @Test @JiraKey(value = "HHH-10960") - public void testDeprecation() { - TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> { + public void testDeprecation(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Session session = entityManager.unwrap( Session.class ); CriteriaBuilder builder = session.getCriteriaBuilder(); @@ -244,13 +248,8 @@ private T serializeDeserialize(T object) { byteIn.close(); } catch (Exception e) { - Assert.fail( "Unable to serialize / deserialize the object: " + e.getMessage() ); + Assertions.fail( "Unable to serialize / deserialize the object: " + e.getMessage() ); } return serializedObject; } - - @Override - public void releaseResources() { - super.releaseResources(); - } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CriteriaQualifiedJoinTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CriteriaQualifiedJoinTest.java index 9395e6f1594a..ce5f0c18891a 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CriteriaQualifiedJoinTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CriteriaQualifiedJoinTest.java @@ -49,7 +49,7 @@ public void setUp(EntityManagerFactoryScope scope) { scope.inTransaction( entityManager -> { final Secondary secondaryA = new Secondary( 1, "a" ); final Secondary secondaryB = new Secondary( 2, "b" ); - ArrayList entities = new ArrayList( List.of( + ArrayList entities = new ArrayList<>( List.of( secondaryA, secondaryB, new Primary( 1, secondaryA ), diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CriteriaQueryTypeQueryAdapterTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CriteriaQueryTypeQueryAdapterTest.java index 47c6d94d9675..2fa7034aea5f 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CriteriaQueryTypeQueryAdapterTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CriteriaQueryTypeQueryAdapterTest.java @@ -4,16 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; - -import java.io.Serializable; -import java.time.Instant; -import java.util.Date; -import java.util.HashSet; -import java.util.Set; - import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.ManyToOne; @@ -26,27 +16,31 @@ import jakarta.persistence.criteria.ParameterExpression; import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; - -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; import org.hibernate.query.Query; import org.hibernate.query.SemanticException; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; -public class CriteriaQueryTypeQueryAdapterTest extends BaseEntityManagerFunctionalTestCase { +import org.junit.jupiter.api.Test; - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { - Bid.class, - Item.class - }; - } +import java.io.Serializable; +import java.time.Instant; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@Jpa(annotatedClasses = {CriteriaQueryTypeQueryAdapterTest.Bid.class, CriteriaQueryTypeQueryAdapterTest.Item.class}) +public class CriteriaQueryTypeQueryAdapterTest { @Test @JiraKey(value = "HHH-12685") - public void testCriteriaQueryParameterIsBoundCheckNotFails() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testCriteriaQueryParameterIsBoundCheckNotFails(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery query = builder.createQuery( Item.class ); Root root = query.from( Item.class ); @@ -62,8 +56,8 @@ public void testCriteriaQueryParameterIsBoundCheckNotFails() { @Test @JiraKey(value = "HHH-12685") - public void testCriteriaQueryGetParameters() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testCriteriaQueryGetParameters(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery query = builder.createQuery( Item.class ); Root root = query.from( Item.class ); @@ -82,54 +76,69 @@ public void testCriteriaQueryGetParameters() { } @JiraKey(value = "HHH-12685") - @Test(expected = IllegalArgumentException.class) - public void testCriteriaQueryGetParameterOfWrongType() { - doInJPA( this::entityManagerFactory, entityManager -> { - CriteriaBuilder builder = entityManager.getCriteriaBuilder(); - CriteriaQuery query = builder.createQuery( Item.class ); - Root root = query.from( Item.class ); - ParameterExpression parameter = builder.parameter( String.class, "name" ); - Predicate predicate = builder.equal( root.get( "name" ), parameter ); - query.where( predicate ); - TypedQuery criteriaQuery = entityManager.createQuery( query ); - criteriaQuery.getParameter( "name", Integer.class ); - } ); + @Test + public void testCriteriaQueryGetParameterOfWrongType(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> + assertThrows( + IllegalArgumentException.class, + () -> { + CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery query = builder.createQuery( Item.class ); + Root root = query.from( Item.class ); + ParameterExpression parameter = builder.parameter( String.class, "name" ); + Predicate predicate = builder.equal( root.get( "name" ), parameter ); + query.where( predicate ); + TypedQuery criteriaQuery = entityManager.createQuery( query ); + criteriaQuery.getParameter( "name", Integer.class ); + } + ) + ); } @JiraKey(value = "HHH-12685") - @Test(expected = IllegalArgumentException.class) - public void testCriteriaQueryGetNonExistingParameter() { - doInJPA( this::entityManagerFactory, entityManager -> { - CriteriaBuilder builder = entityManager.getCriteriaBuilder(); - CriteriaQuery query = builder.createQuery( Item.class ); - Root root = query.from( Item.class ); - ParameterExpression parameter = builder.parameter( String.class, "name" ); - Predicate predicate = builder.equal( root.get( "name" ), parameter ); - query.where( predicate ); - TypedQuery criteriaQuery = entityManager.createQuery( query ); - criteriaQuery.getParameter( "placedAt" ); - } ); + @Test + public void testCriteriaQueryGetNonExistingParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> + assertThrows( + IllegalArgumentException.class, + () -> { + CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery query = builder.createQuery( Item.class ); + Root root = query.from( Item.class ); + ParameterExpression parameter = builder.parameter( String.class, "name" ); + Predicate predicate = builder.equal( root.get( "name" ), parameter ); + query.where( predicate ); + TypedQuery criteriaQuery = entityManager.createQuery( query ); + criteriaQuery.getParameter( "placedAt" ); + } + ) + ); } - @Test(expected = IllegalArgumentException.class) + @Test @JiraKey("HHH-13932") - public void testCriteriaQuerySetNonExistingParameter() { - doInJPA( this::entityManagerFactory, entityManager -> { - CriteriaBuilder builder = entityManager.getCriteriaBuilder(); - CriteriaQuery query = builder.createQuery( Item.class ); - Root root = query.from( Item.class ); - ParameterExpression parameter = builder.parameter( String.class, "name" ); - Predicate predicate = builder.equal( root.get( "name" ), parameter ); - query.where( predicate ); - TypedQuery criteriaQuery = entityManager.createQuery( query ); - ParameterExpression nonExistingParam = builder.parameter( String.class, "nonExistingParam" ); - criteriaQuery.setParameter( nonExistingParam, "George" ); - } ); + public void testCriteriaQuerySetNonExistingParameter(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> + assertThrows( + IllegalArgumentException.class, + () -> { + CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery query = builder.createQuery( Item.class ); + Root root = query.from( Item.class ); + ParameterExpression parameter = builder.parameter( String.class, "name" ); + Predicate predicate = builder.equal( root.get( "name" ), parameter ); + query.where( predicate ); + TypedQuery criteriaQuery = entityManager.createQuery( query ); + ParameterExpression nonExistingParam = builder.parameter( String.class, "nonExistingParam" ); + criteriaQuery.setParameter( nonExistingParam, "George" ); + } + ) + ); } @Test - public void testSetParameterPassingTypeNotFails() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testSetParameterPassingTypeNotFails(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery query = builder.createQuery( Item.class ); @@ -146,8 +155,8 @@ public void testSetParameterPassingTypeNotFails() { } @Test - public void testSetParameterTypeInstantNotFails() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testSetParameterTypeInstantNotFails(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery query = builder.createQuery( Bid.class ); @@ -163,41 +172,51 @@ public void testSetParameterTypeInstantNotFails() { } ); } - @Test(expected = SemanticException.class) - public void testSetParameterOfTypeInstantToAFloatParameterType() { - doInJPA( this::entityManagerFactory, entityManager -> { - CriteriaBuilder builder = entityManager.getCriteriaBuilder(); - CriteriaQuery query = builder.createQuery( Bid.class ); - - Predicate predicate = builder.equal( - query.from( Bid.class ).get( "amount" ), - builder.parameter( Instant.class, "placedAt" ) - ); - query.where( predicate ); - - Query criteriaQuery = (Query) entityManager.createQuery( query ); - - criteriaQuery.setParameter( "placedAt", Instant.now() ).list(); - } ); + @Test + public void testSetParameterOfTypeInstantToAFloatParameterType(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> + assertThrows( + SemanticException.class, + () -> { + CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery query = builder.createQuery( Bid.class ); + + Predicate predicate = builder.equal( + query.from( Bid.class ).get( "amount" ), + builder.parameter( Instant.class, "placedAt" ) + ); + query.where( predicate ); + + Query criteriaQuery = (Query) entityManager.createQuery( query ); + + criteriaQuery.setParameter( "placedAt", Instant.now() ).list(); + } + ) + ); } - @Test(expected = SemanticException.class) - public void testSetParameterOfTypeDateToAFloatParameterType() { - doInJPA( this::entityManagerFactory, entityManager -> { - CriteriaBuilder builder = entityManager.getCriteriaBuilder(); - CriteriaQuery query = builder.createQuery( Bid.class ); - - Predicate predicate = builder.equal( - query.from( Bid.class ).get( "amount" ), - builder.parameter( Date.class, "placedAt" ) - ); - query.where( predicate ); - - Query criteriaQuery = (Query) entityManager.createQuery( query ); - - criteriaQuery.setParameter( "placedAt", Date.from(Instant.now()), TemporalType.DATE ).list(); - } ); + @Test + public void testSetParameterOfTypeDateToAFloatParameterType(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> + assertThrows( + SemanticException.class, + () -> { + CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + CriteriaQuery query = builder.createQuery( Bid.class ); + + Predicate predicate = builder.equal( + query.from( Bid.class ).get( "amount" ), + builder.parameter( Date.class, "placedAt" ) + ); + query.where( predicate ); + + Query criteriaQuery = (Query) entityManager.createQuery( query ); + + criteriaQuery.setParameter( "placedAt", Date.from(Instant.now()), TemporalType.DATE ).list(); + } + ) + ); } @Entity(name = "Bid") diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CriteriaWithDynamicInstantiationAndOrderByTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CriteriaWithDynamicInstantiationAndOrderByTest.java index 1f0f3c9892cc..74af46eb1f6b 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CriteriaWithDynamicInstantiationAndOrderByTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/CriteriaWithDynamicInstantiationAndOrderByTest.java @@ -33,7 +33,7 @@ public class CriteriaWithDynamicInstantiationAndOrderByTest { private static final Long ITEM_ID = 1l; - private static final String ITEM_NAME = "cisel"; + private static final String ITEM_NAME = "chisel"; @BeforeAll public void setUp(EntityManagerFactoryScope scope) { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/EntitySuperclassCollectionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/EntitySuperclassCollectionTest.java index bff44a2c04cc..941c3a731c40 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/EntitySuperclassCollectionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/EntitySuperclassCollectionTest.java @@ -4,12 +4,8 @@ */ package org.hibernate.orm.test.jpa.criteria; -import java.util.ArrayList; -import java.util.List; import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; -import jakarta.persistence.EntityManager; -import jakarta.persistence.EntityTransaction; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.OneToMany; @@ -18,39 +14,41 @@ import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; + +import org.junit.jupiter.api.Test; -import org.junit.Test; +import java.util.ArrayList; +import java.util.List; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author Janario Oliveira * @author Gail Badner */ -public class EntitySuperclassCollectionTest - extends BaseEntityManagerFunctionalTestCase { - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { - PersonBase.class, Person.class, Address.class - }; - } +@Jpa(annotatedClasses = { + EntitySuperclassCollectionTest.PersonBase.class, + EntitySuperclassCollectionTest.Person.class, + EntitySuperclassCollectionTest.Address.class} +) +public class EntitySuperclassCollectionTest { @Test @JiraKey(value = "HHH-10556") - public void testPerson() { + public void testPerson(EntityManagerFactoryScope scope) { String address = "super-address"; - PersonBase person = createPerson( new Person(), address ); + PersonBase person = createPerson( scope, new Person(), address ); - assertAddress( person, address ); + assertAddress( scope, person, address ); } - private void assertAddress(PersonBase person, String address) { + private void assertAddress(EntityManagerFactoryScope scope, PersonBase person, String address) { List results = find( + scope, person.getClass(), person.id, "addresses" @@ -59,35 +57,31 @@ private void assertAddress(PersonBase person, String address) { assertEquals( person.addresses.get( 0 ).id, - ( (Address) results.get( 0 ) ).id + ((Address) results.get( 0 )).id ); - assertEquals( address, ( (Address) results.get( 0 ) ).name ); - - getOrCreateEntityManager().close(); + assertEquals( address, ((Address) results.get( 0 )).name ); } - private PersonBase createPerson(PersonBase person, String address) { - EntityManager em = createEntityManager(); - EntityTransaction tx = em.getTransaction(); - tx.begin(); + private PersonBase createPerson(EntityManagerFactoryScope scope, PersonBase person, String address) { + PersonBase personBase; person.addresses.add( new Address( address ) ); - person = em.merge( person ); - tx.commit(); - return person; + personBase = scope.fromTransaction( entityManager -> entityManager.merge( person ) ); + return personBase; } - private List find(Class clazz, int id, String path) { - EntityManager em = createEntityManager(); - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery(); - Root root = cq.from( clazz ); + private List find(EntityManagerFactoryScope scope, Class clazz, int id, String path) { + return scope.fromEntityManager( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(); + Root root = cq.from( clazz ); - cq.select( root.get( path ) ) - .where( cb.equal( root.get( "id" ), id ) ); + cq.select( root.get( path ) ) + .where( cb.equal( root.get( "id" ), id ) ); - TypedQuery query = em.createQuery( cq ); - return query.getResultList(); + TypedQuery query = entityManager.createQuery( cq ); + return query.getResultList(); + } ); } @Entity(name = "Address") @@ -111,7 +105,7 @@ public abstract static class PersonBase { @GeneratedValue Integer id; @OneToMany(cascade = CascadeType.ALL) - List
addresses = new ArrayList
(); + List
addresses = new ArrayList<>(); } @Entity(name = "Person") diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/EntityUseJoinedSubclassOptimizationTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/EntityUseJoinedSubclassOptimizationTest.java index c4592c87f3c4..05af8f5b46e3 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/EntityUseJoinedSubclassOptimizationTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/EntityUseJoinedSubclassOptimizationTest.java @@ -42,7 +42,7 @@ public void testEqTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where type(t) = House" ) + entityManager.createSelectionQuery( "from Thing t where type(t) = House", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); // We need to join all tables because the EntityResult will create fetches for all subtypes. @@ -95,7 +95,7 @@ public void testEqSuperTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "select 1 from Thing t where type(t) = Building" ) + entityManager.createSelectionQuery( "select 1 from Thing t where type(t) = Building", Integer.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -123,7 +123,7 @@ public void testEqTypeRestrictionSelectId(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "select t.id from Thing t where type(t) = House" ) + entityManager.createSelectionQuery( "select t.id from Thing t where type(t) = House", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); // If we use select items directly, we only use the entity name on which the attribute was declared, @@ -149,7 +149,7 @@ public void testNotEqTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where type(t) <> House" ) + entityManager.createSelectionQuery( "from Thing t where type(t) <> House", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); // We need to join all tables because the EntityDomainResult will create fetches for all subtypes @@ -200,7 +200,7 @@ public void testInTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where type(t) in (House, Car)" ) + entityManager.createSelectionQuery( "from Thing t where type(t) in (House, Car)", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -249,7 +249,7 @@ public void testInTypeCommonSuperTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where type(t) in (House, Skyscraper)" ) + entityManager.createSelectionQuery( "from Thing t where type(t) in (House, Skyscraper)", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -298,7 +298,7 @@ public void testNotInTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where type(t) not in (House, Car)" ) + entityManager.createSelectionQuery( "from Thing t where type(t) not in (House, Car)", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -347,7 +347,7 @@ public void testTreatPath(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where treat(t as House).familyName is not null" ) + entityManager.createSelectionQuery( "from Thing t where treat(t as House).familyName is not null", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); // We need to join all tables because the EntityResult will create fetches for all subtypes. @@ -389,7 +389,7 @@ public void testTreatPathEverywhere(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "select treat(t as House) from Thing t where treat(t as House).familyName is not null" ) + entityManager.createSelectionQuery( "select treat(t as House) from Thing t where treat(t as House).familyName is not null", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); // We need to join all tables because the EntityResult will create fetches for all subtypes. @@ -416,7 +416,7 @@ public void testTreatPathSharedColumn(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where treat(t as Skyscraper).doors is not null" ) + entityManager.createSelectionQuery( "from Thing t where treat(t as Skyscraper).doors is not null", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -465,7 +465,7 @@ public void testTreatPathEverywhereSharedColumn(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "select treat(t as Skyscraper) from Thing t where treat(t as Skyscraper).doors is not null" ) + entityManager.createSelectionQuery( "select treat(t as Skyscraper) from Thing t where treat(t as Skyscraper).doors is not null", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -494,7 +494,7 @@ public void testQueryChildUseParent(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "select t.nr from Skyscraper t" ) + entityManager.createSelectionQuery( "select t.nr from Skyscraper t", Integer.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/EntityUseSingleTableOptimizationTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/EntityUseSingleTableOptimizationTest.java index 6fe91a2915c3..d984b6f8233a 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/EntityUseSingleTableOptimizationTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/EntityUseSingleTableOptimizationTest.java @@ -42,7 +42,7 @@ public void testEqTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where type(t) = House" ) + entityManager.createSelectionQuery( "from Thing t where type(t) = House", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -70,7 +70,7 @@ public void testEqSuperTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "select 1 from Thing t where type(t) = Building" ) + entityManager.createSelectionQuery( "select 1 from Thing t where type(t) = Building", Integer.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -91,7 +91,7 @@ public void testEqTypeRestrictionSelectId(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "select t.id from Thing t where type(t) = House" ) + entityManager.createSelectionQuery( "select t.id from Thing t where type(t) = House", Long.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -112,7 +112,7 @@ public void testNotEqTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where type(t) <> House" ) + entityManager.createSelectionQuery( "from Thing t where type(t) <> House", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -140,7 +140,7 @@ public void testInTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where type(t) in (House, Car)" ) + entityManager.createSelectionQuery( "from Thing t where type(t) in (House, Car)", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -168,7 +168,7 @@ public void testInTypeCommonSuperTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where type(t) in (House, Skyscraper)" ) + entityManager.createSelectionQuery( "from Thing t where type(t) in (House, Skyscraper)", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -196,7 +196,7 @@ public void testNotInTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where type(t) not in (House, Car)" ) + entityManager.createSelectionQuery( "from Thing t where type(t) not in (House, Car)", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -224,7 +224,7 @@ public void testTreatPath(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where treat(t as House).familyName is not null" ) + entityManager.createSelectionQuery( "from Thing t where treat(t as House).familyName is not null", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -252,7 +252,7 @@ public void testTreatPathSharedColumn(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where treat(t as Skyscraper).doors is not null" ) + entityManager.createSelectionQuery( "from Thing t where treat(t as Skyscraper).doors is not null", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -280,7 +280,7 @@ public void testTreatPathInDisjunction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where treat(t as House).familyName is not null or t.id > 0" ) + entityManager.createSelectionQuery( "from Thing t where treat(t as House).familyName is not null or t.id > 0", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -308,7 +308,7 @@ public void testTypeRestrictionInDisjunction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where type(t) = House or t.id > 0" ) + entityManager.createSelectionQuery( "from Thing t where type(t) = House or t.id > 0", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -336,7 +336,7 @@ public void testQueryChildUseParent(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "select t.nr from Skyscraper t" ) + entityManager.createSelectionQuery( "select t.nr from Skyscraper t", Integer.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/EntityUseUnionSubclassOptimizationTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/EntityUseUnionSubclassOptimizationTest.java index f3321a893250..46fcc7bda8e0 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/EntityUseUnionSubclassOptimizationTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/EntityUseUnionSubclassOptimizationTest.java @@ -42,7 +42,7 @@ public void testEqTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where type(t) = House" ) + entityManager.createSelectionQuery( "from Thing t where type(t) = House", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -72,7 +72,7 @@ public void testEqSuperTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "select 1 from Thing t where type(t) = Building" ) + entityManager.createSelectionQuery( "select 1 from Thing t where type(t) = Building", Integer.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -95,7 +95,7 @@ public void testEqTypeRestrictionSelectId(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "select t.id from Thing t where type(t) = House" ) + entityManager.createSelectionQuery( "select t.id from Thing t where type(t) = House", Long.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -118,7 +118,7 @@ public void testNotEqTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where type(t) <> House" ) + entityManager.createSelectionQuery( "from Thing t where type(t) <> House", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -156,7 +156,7 @@ public void testInTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where type(t) in (House, Car)" ) + entityManager.createSelectionQuery( "from Thing t where type(t) in (House, Car)", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -188,7 +188,7 @@ public void testInTypeCommonSuperTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where type(t) in (House, Skyscraper)" ) + entityManager.createSelectionQuery( "from Thing t where type(t) in (House, Skyscraper)", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -220,7 +220,7 @@ public void testNotInTypeRestriction(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where type(t) not in (House, Car)" ) + entityManager.createSelectionQuery( "from Thing t where type(t) not in (House, Car)", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -256,7 +256,7 @@ public void testTreatPath(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where treat(t as House).familyName is not null" ) + entityManager.createSelectionQuery( "from Thing t where treat(t as House).familyName is not null", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -296,7 +296,7 @@ public void testTreatPathEverywhere(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "select treat(t as House) from Thing t where treat(t as House).familyName is not null" ) + entityManager.createSelectionQuery( "select treat(t as House) from Thing t where treat(t as House).familyName is not null", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -321,7 +321,7 @@ public void testTreatPathSharedColumn(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "from Thing t where treat(t as Skyscraper).doors is not null" ) + entityManager.createSelectionQuery( "from Thing t where treat(t as Skyscraper).doors is not null", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -361,7 +361,7 @@ public void testTreatPathEverywhereSharedColumn(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "select treat(t as Skyscraper) from Thing t where treat(t as Skyscraper).doors is not null" ) + entityManager.createSelectionQuery( "select treat(t as Skyscraper) from Thing t where treat(t as Skyscraper).doors is not null", Thing.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( @@ -387,7 +387,7 @@ public void testQueryChildUseParent(SessionFactoryScope scope) { scope.inTransaction( entityManager -> { sqlStatementInterceptor.clear(); - entityManager.createSelectionQuery( "select t.nr from Skyscraper t" ) + entityManager.createSelectionQuery( "select t.nr from Skyscraper t", Integer.class ) .getResultList(); sqlStatementInterceptor.assertExecutedCount( 1 ); assertEquals( diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/GroupByTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/GroupByTest.java index db7d7f1e6ca3..8502a411470b 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/GroupByTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/GroupByTest.java @@ -105,27 +105,27 @@ public Address getAddress2() { } @Entity(name = "Address") - @Table(name = "ADRESS_TABLE") + @Table(name = "ADDRESS_TABLE") public static class Address { @Id private Integer id; - private String descriptiom; + private String description; public Address() { } - public Address(Integer id, String descriptiom) { + public Address(Integer id, String description) { this.id = id; - this.descriptiom = descriptiom; + this.description = description; } public Integer getId() { return id; } - public String getDescriptiom() { - return descriptiom; + public String getDescription() { + return description; } } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/OnKeywordTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/OnKeywordTest.java index 0ca6accc3d98..7a7b39645ee5 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/OnKeywordTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/OnKeywordTest.java @@ -8,12 +8,29 @@ import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; +import org.hibernate.orm.test.jpa.metamodel.Address; +import org.hibernate.orm.test.jpa.metamodel.Alias; +import org.hibernate.orm.test.jpa.metamodel.Country; +import org.hibernate.orm.test.jpa.metamodel.CreditCard; +import org.hibernate.orm.test.jpa.metamodel.Customer; +import org.hibernate.orm.test.jpa.metamodel.Entity1; +import org.hibernate.orm.test.jpa.metamodel.Entity2; +import org.hibernate.orm.test.jpa.metamodel.Entity3; +import org.hibernate.orm.test.jpa.metamodel.Info; import org.hibernate.orm.test.jpa.metamodel.LineItem; import org.hibernate.orm.test.jpa.metamodel.LineItem_; import org.hibernate.orm.test.jpa.metamodel.Order; import org.hibernate.orm.test.jpa.metamodel.Order_; +import org.hibernate.orm.test.jpa.metamodel.Phone; +import org.hibernate.orm.test.jpa.metamodel.Product; +import org.hibernate.orm.test.jpa.metamodel.ShelfLife; +import org.hibernate.orm.test.jpa.metamodel.Spouse; +import org.hibernate.orm.test.jpa.metamodel.Thing; +import org.hibernate.orm.test.jpa.metamodel.ThingWithQuantity; +import org.hibernate.orm.test.jpa.metamodel.VersionedEntity; import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.Test; /** @@ -21,7 +38,27 @@ * * @author Steve Ebersole */ -public class OnKeywordTest extends AbstractCriteriaTest { +@Jpa(annotatedClasses = { + Address.class, + Alias.class, + Country.class, + CreditCard.class, + Customer.class, + Entity1.class, + Entity2.class, + Entity3.class, + Info.class, + LineItem.class, + Order.class, + Phone.class, + Product.class, + ShelfLife.class, + Spouse.class, + Thing.class, + ThingWithQuantity.class, + VersionedEntity.class +}) +public class OnKeywordTest { @Test public void basicTest(EntityManagerFactoryScope scope) { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/ParameterTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/ParameterTest.java index 9d134d5ad6dd..488cdca7ce29 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/ParameterTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/ParameterTest.java @@ -27,8 +27,8 @@ import jakarta.persistence.criteria.Root; import static org.hamcrest.CoreMatchers.instanceOf; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.hamcrest.MatcherAssert.assertThat; /** * @author Steve Ebersole diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/PowerFunctionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/PowerFunctionTest.java index e8693a6f5d77..0d0b25180c37 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/PowerFunctionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/PowerFunctionTest.java @@ -56,9 +56,7 @@ public void testIt(EntityManagerFactoryScope scope) { assertThat( results.size() ).isEqualTo( 1 ); if ( getDialect( scope ) instanceof DerbyDialect ) { - /** - for Derby dialect we are emulating the power function see {@link CommonFunctionFactory#power_expLn()}. - */ + // for Derby dialect we are emulating the power function see {@link CommonFunctionFactory#power_expLn()}. assertThat( results.get( 0 ) ).isEqualTo( 2500D, Offset.offset( 0.000000000001 ) ); } else { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/QueryBuilderTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/QueryBuilderTest.java index 41fa42fc735e..5a0cac251c84 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/QueryBuilderTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/QueryBuilderTest.java @@ -7,7 +7,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; -import jakarta.persistence.EntityManager; + import jakarta.persistence.Tuple; import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; @@ -22,7 +22,6 @@ import org.hibernate.dialect.CockroachDialect; import org.hibernate.exception.GenericJDBCException; import org.hibernate.exception.SQLGrammarException; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; import org.hibernate.orm.test.jpa.metamodel.Address; import org.hibernate.orm.test.jpa.metamodel.Alias; import org.hibernate.orm.test.jpa.metamodel.Country; @@ -38,262 +37,245 @@ import org.hibernate.orm.test.jpa.metamodel.Spouse; import org.hibernate.query.sqm.tree.predicate.SqmComparisonPredicate; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.Jpa; import org.hibernate.testing.orm.junit.SkipForDialect; -import org.hibernate.testing.transaction.TransactionUtil2; -import org.junit.Test; +import org.junit.jupiter.api.Test; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; /** * @author Steve Ebersole */ -public class QueryBuilderTest extends BaseEntityManagerFunctionalTestCase { - @Override - public Class[] getAnnotatedClasses() { - return new Class[] { - Address.class, - Alias.class, - Country.class, - CreditCard.class, - Customer.class, - Human.class, - Info.class, - LineItem.class, - Order.class, - Phone.class, - Product.class, - ShelfLife.class, - Spouse.class, - Book.class, - Store.class - }; - } +@Jpa(annotatedClasses = { + Address.class, + Alias.class, + Country.class, + CreditCard.class, + Customer.class, + Human.class, + Info.class, + LineItem.class, + Order.class, + Phone.class, + Product.class, + ShelfLife.class, + Spouse.class, + Book.class, + Store.class +}) +public class QueryBuilderTest { @Test - public void testEqualityComparisonLiteralConversion() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaBuilder cb = em.getCriteriaBuilder(); - Metamodel mm = em.getMetamodel(); - - CriteriaQuery cquery = cb.createQuery( Integer.class ); - Root product = cquery.from( Product.class ); - EntityType Product_ = mm.entity( Product.class ); - - cquery.select( - cb.toInteger( - product.get( - Product_.getSingularAttribute( "quantity", Integer.class ) ) - ) - ); - - SqmComparisonPredicate predicate = (SqmComparisonPredicate) cb.equal( - product.get( Product_.getSingularAttribute( "partNumber", Long.class ) ), - 373767373 - ); - assertEquals( Long.class, predicate.getLeftHandExpression().getJavaType() ); - cquery.where( predicate ); - em.createQuery( cquery ).getResultList(); - - predicate = (SqmComparisonPredicate) cb.ge( - cb.length( product.get( Product_.getSingularAttribute( "name", String.class ) ) ), - 4L - ); - assertEquals( Integer.class, predicate.getLeftHandExpression().getJavaType() ); - cquery.where( predicate ); - em.createQuery( cquery ).getResultList(); - - em.getTransaction().commit(); - em.close(); - } + public void testEqualityComparisonLiteralConversion(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { - @Test - public void testEqualityComparisonEntityConversion() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - Address address = new Address( "Street Id", "Fake Street", "Fake City", "Fake State", "Fake Zip" ); - Phone phone1 = new Phone( "1", "555", "0001", address ); - Phone phone2 = new Phone( "2", "555", "0002", address ); - Phone phone3 = new Phone( "3", "555", "0003", address ); - Phone phone4 = new Phone( "4", "555", "0004" ); + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + Metamodel mm = entityManager.getMetamodel(); - List phones = new ArrayList<>( 3 ); - phones.add( phone1 ); - phones.add( phone2 ); - phones.add( phone3 ); + CriteriaQuery cquery = cb.createQuery( Integer.class ); + Root product = cquery.from( Product.class ); + EntityType Product_ = mm.entity( Product.class ); - address.setPhones( phones ); - em.persist( address ); - em.persist( phone4 ); + cquery.select( + cb.toInteger( + product.get( + Product_.getSingularAttribute( "quantity", Integer.class ) ) + ) + ); - em.getTransaction().commit(); + SqmComparisonPredicate predicate = (SqmComparisonPredicate) cb.equal( + product.get( Product_.getSingularAttribute( "partNumber", Long.class ) ), + 373767373 + ); + assertEquals( Long.class, predicate.getLeftHandExpression().getJavaType() ); + cquery.where( predicate ); + entityManager.createQuery( cquery ).getResultList(); + predicate = (SqmComparisonPredicate) cb.ge( + cb.length( product.get( Product_.getSingularAttribute( "name", String.class ) ) ), + 4L + ); + assertEquals( Integer.class, predicate.getLeftHandExpression().getJavaType() ); + cquery.where( predicate ); + entityManager.createQuery( cquery ).getResultList(); - em.getTransaction().begin(); + } ); + } + + @Test + public void testEqualityComparisonEntityConversion(EntityManagerFactoryScope scope) { + Address address = new Address( "Street Id", "Fake Street", "Fake City", "Fake State", "Fake Zip" ); + scope.inTransaction( entityManager -> { + Phone phone1 = new Phone( "1", "555", "0001", address ); + Phone phone2 = new Phone( "2", "555", "0002", address ); + Phone phone3 = new Phone( "3", "555", "0003", address ); + Phone phone4 = new Phone( "4", "555", "0004" ); + + List phones = new ArrayList<>( 3 ); + phones.add( phone1 ); + phones.add( phone2 ); + phones.add( phone3 ); + + address.setPhones( phones ); + entityManager.persist( address ); + entityManager.persist( phone4 ); + } ); - CriteriaBuilder cb = em.getCriteriaBuilder(); - Metamodel mm = em.getMetamodel(); - EntityType Phone_ = mm.entity( Phone.class ); - CriteriaQuery cquery = cb.createQuery( Phone.class ); - Root phone = cquery.from( Phone.class ); - Predicate predicate = cb.equal( - phone.get( Phone_.getSingularAttribute( "address", Address.class ) ), - address - ); - cquery.where( predicate ); - List results = em.createQuery( cquery ).getResultList(); + scope.inTransaction( entityManager -> { + + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + Metamodel mm = entityManager.getMetamodel(); + EntityType Phone_ = mm.entity( Phone.class ); + + CriteriaQuery cquery = cb.createQuery( Phone.class ); + Root phone = cquery.from( Phone.class ); + Predicate predicate = cb.equal( + phone.get( Phone_.getSingularAttribute( "address", Address.class ) ), + address + ); + cquery.where( predicate ); + List results = entityManager.createQuery( cquery ).getResultList(); - assertEquals( 3, results.size() ); - em.getTransaction().commit(); - em.close(); + assertEquals( 3, results.size() ); + } ); } @Test - public void testTypeConversion() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaBuilder cb = em.getCriteriaBuilder(); - Metamodel mm = em.getMetamodel(); - EntityType Product_ = mm.entity( Product.class ); - - // toFloat - CriteriaQuery floatQuery = cb.createQuery( Float.class ); - Root product = floatQuery.from( Product.class ); - floatQuery.select( - cb.toFloat( - product.get( Product_.getSingularAttribute( "quantity", Integer.class ) ) - ) - ); - em.createQuery( floatQuery ).getResultList(); - - // toDouble - CriteriaQuery doubleQuery = cb.createQuery( Double.class ); - product = doubleQuery.from( Product.class ); - doubleQuery.select( - cb.toDouble( - product.get( Product_.getSingularAttribute( "quantity", Integer.class ) ) - ) - ); - em.createQuery( doubleQuery ).getResultList(); - - em.getTransaction().commit(); - em.close(); + public void testTypeConversion(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + Metamodel mm = entityManager.getMetamodel(); + EntityType Product_ = mm.entity( Product.class ); + + // toFloat + CriteriaQuery floatQuery = cb.createQuery( Float.class ); + Root product = floatQuery.from( Product.class ); + floatQuery.select( + cb.toFloat( + product.get( Product_.getSingularAttribute( "quantity", Integer.class ) ) + ) + ); + entityManager.createQuery( floatQuery ).getResultList(); + + // toDouble + CriteriaQuery doubleQuery = cb.createQuery( Double.class ); + product = doubleQuery.from( Product.class ); + doubleQuery.select( + cb.toDouble( + product.get( Product_.getSingularAttribute( "quantity", Integer.class ) ) + ) + ); + entityManager.createQuery( doubleQuery ).getResultList(); + + } ); } @Test - public void testConstructor() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaBuilder cb = em.getCriteriaBuilder(); - - CriteriaQuery cquery = cb.createQuery( Customer.class ); - Root customer = cquery.from( Customer.class ); - EntityType Customer_ = customer.getModel(); - - cquery.select( - cb.construct( - Customer.class, - customer.get( Customer_.getSingularAttribute( "id", String.class ) ), - customer.get( Customer_.getSingularAttribute( "name", String.class ) ) - ) - ); - TypedQuery tq = em.createQuery( cquery ); - tq.getResultList(); - - em.getTransaction().commit(); - em.close(); + public void testConstructor(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + + CriteriaQuery cquery = cb.createQuery( Customer.class ); + Root customer = cquery.from( Customer.class ); + EntityType Customer_ = customer.getModel(); + + cquery.select( + cb.construct( + Customer.class, + customer.get( Customer_.getSingularAttribute( "id", String.class ) ), + customer.get( Customer_.getSingularAttribute( "name", String.class ) ) + ) + ); + TypedQuery tq = entityManager.createQuery( cquery ); + tq.getResultList(); + + } ); } @Test @JiraKey(value = "HHH-8699") - public void testMultiselectWithPredicates() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - em.createQuery( "select (c.id, c.name), c.age from Customer c" ).getResultList(); - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createTupleQuery(); - Root r = cq.from( Customer.class ); - cq.multiselect( - r.get( Customer_.id ), r.get( Customer_.name ), - cb.concat( "Hello ", r.get( Customer_.name ) ), cb.isNotNull( r.get( Customer_.age ) ) - ); - TypedQuery tq = em.createQuery( cq ); - tq.getResultList(); - - em.getTransaction().commit(); - em.close(); + public void testMultiselectWithPredicates(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + + entityManager.createQuery( "select (c.id, c.name), c.age from Customer c" ).getResultList(); + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createTupleQuery(); + Root r = cq.from( Customer.class ); + cq.multiselect( + r.get( Customer_.id ), r.get( Customer_.name ), + cb.concat( "Hello ", r.get( Customer_.name ) ), cb.isNotNull( r.get( Customer_.age ) ) + ); + TypedQuery tq = entityManager.createQuery( cq ); + tq.getResultList(); + + } ); } @Test @SkipForDialect(dialectClass = CockroachDialect.class) - public void testDateTimeFunctions() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaBuilder cb = em.getCriteriaBuilder(); - - CriteriaQuery dateQuery = cb.createQuery( java.sql.Date.class ); - dateQuery.from( Customer.class ); - dateQuery.select( cb.currentDate() ); - em.createQuery( dateQuery ).getResultList(); - - CriteriaQuery timeQuery = cb.createQuery( java.sql.Time.class ); - timeQuery.from( Customer.class ); - timeQuery.select( cb.currentTime() ); - em.createQuery( timeQuery ).getResultList(); - - CriteriaQuery tsQuery = cb.createQuery( java.sql.Timestamp.class ); - tsQuery.from( Customer.class ); - tsQuery.select( cb.currentTimestamp() ); - em.createQuery( tsQuery ).getResultList(); - - em.getTransaction().commit(); - em.close(); + public void testDateTimeFunctions(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + + CriteriaQuery dateQuery = cb.createQuery( java.sql.Date.class ); + dateQuery.from( Customer.class ); + dateQuery.select( cb.currentDate() ); + entityManager.createQuery( dateQuery ).getResultList(); + + CriteriaQuery timeQuery = cb.createQuery( java.sql.Time.class ); + timeQuery.from( Customer.class ); + timeQuery.select( cb.currentTime() ); + entityManager.createQuery( timeQuery ).getResultList(); + + CriteriaQuery tsQuery = cb.createQuery( java.sql.Timestamp.class ); + tsQuery.from( Customer.class ); + tsQuery.select( cb.currentTimestamp() ); + entityManager.createQuery( tsQuery ).getResultList(); + + } ); } @Test - @SkipForDialect(dialectClass = InformixDialect.class, majorVersion = 11, minorVersion = 70, reason = "Informix does not support count literals") - public void testFunctionDialectFunctions() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery criteria = cb.createQuery( Long.class ); - criteria.select( cb.count( cb.literal( 1 ) ) ); - Root root = criteria.from( Customer.class ); - criteria.where( - cb.equal( - cb.function( - "substring", - String.class, - root.get( Customer_.name ), - cb.literal( 1 ), - cb.literal( 1 ) - ), - cb.literal( "a" ) - ) - ); - em.createQuery( criteria ).getResultList(); - em.getTransaction().commit(); - em.close(); + @SkipForDialect(dialectClass = InformixDialect.class, majorVersion = 11, minorVersion = 70, + reason = "Informix does not support count literals") + public void testFunctionDialectFunctions(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery criteria = cb.createQuery( Long.class ); + criteria.select( cb.count( cb.literal( 1 ) ) ); + Root root = criteria.from( Customer.class ); + criteria.where( + cb.equal( + cb.function( + "substring", + String.class, + root.get( Customer_.name ), + cb.literal( 1 ), + cb.literal( 1 ) + ), + cb.literal( "a" ) + ) + ); + entityManager.createQuery( criteria ).getResultList(); + } ); } @Test @JiraKey(value = "HHH-10737") - public void testMissingDialectFunction() { - TransactionUtil2.inTransaction( entityManagerFactory(), (em) -> { + public void testMissingDialectFunction(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Human human = new Human(); human.setId( 200L ); human.setName( "2" ); - em.persist( human ); + entityManager.persist( human ); } ); - TransactionUtil2.inTransaction( entityManagerFactory(), (em) -> { - CriteriaBuilder cb = em.getCriteriaBuilder(); + scope.inTransaction( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery criteria = cb.createQuery( Long.class ); Root root = criteria.from( Human.class ); @@ -312,7 +294,7 @@ public void testMissingDialectFunction() { ); try { - em.createQuery( criteria ).getResultList(); + entityManager.createQuery( criteria ).getResultList(); fail( "Expecting a SQLGrammarException" ); } catch (SQLGrammarException | GenericJDBCException expected) { @@ -323,20 +305,20 @@ public void testMissingDialectFunction() { @Test @JiraKey(value = "HHH-12314") - public void testJoinUsingNegatedPredicate() { + public void testJoinUsingNegatedPredicate(EntityManagerFactoryScope scope) { // Write test data - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { final Store store = new Store(); store.setName( "Acme Books" ); store.setAddress( "123 Main St" ); entityManager.persist( store ); final Book book = new Book(); - book.setStores( new HashSet<>( List.of(store) ) ); + book.setStores( new HashSet<>( List.of( store ) ) ); entityManager.persist( book ); } ); - doInJPA( this::entityManagerFactory, entityManager -> { + scope.inTransaction( entityManager -> { final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); final CriteriaQuery query = cb.createQuery( Book.class ); final Root bookRoot = query.from( Book.class ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/QueryPredicateAndParameterComparableTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/QueryPredicateAndParameterComparableTest.java index fc556cfa7362..aeb90f5af1f9 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/QueryPredicateAndParameterComparableTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/QueryPredicateAndParameterComparableTest.java @@ -203,7 +203,7 @@ public void setDescription(String description) { } @Entity(name = "submissions") - public class Submission { + public static class Submission { private int submissionid; diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/SelectOnlyArrayPropertyTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/SelectOnlyArrayPropertyTest.java index 2eacb31febb8..e5193d6950c5 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/SelectOnlyArrayPropertyTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/SelectOnlyArrayPropertyTest.java @@ -4,10 +4,10 @@ */ package org.hibernate.orm.test.jpa.criteria; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.Test; import jakarta.persistence.Entity; import jakarta.persistence.Id; @@ -16,25 +16,17 @@ import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; @JiraKey("HHH-16606") -public class SelectOnlyArrayPropertyTest extends BaseEntityManagerFunctionalTestCase { - - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { - EntityWithIdAndIntegerArray.class - }; - } +@Jpa(annotatedClasses = {SelectOnlyArrayPropertyTest.EntityWithIdAndIntegerArray.class}) +public class SelectOnlyArrayPropertyTest { @Test @JiraKey("HHH-16606") - public void criteriaSelectOnlyIntArray() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void criteriaSelectOnlyIntArray(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final byte[] result = "Hello, World!".getBytes(); EntityWithIdAndIntegerArray myEntity = new EntityWithIdAndIntegerArray( 1, result ); @@ -57,8 +49,8 @@ public void criteriaSelectOnlyIntArray() { } @Test - public void criteriaSelectWrappedIntArray() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void criteriaSelectWrappedIntArray(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final byte[] result = "Hi there!".getBytes(); EntityWithIdAndIntegerArray myEntity = new EntityWithIdAndIntegerArray( 2, result ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/SuperclassCollectionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/SuperclassCollectionTest.java index 4ef5af5652d4..a5b854f28c7a 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/SuperclassCollectionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/SuperclassCollectionTest.java @@ -8,8 +8,6 @@ import java.util.List; import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; -import jakarta.persistence.EntityManager; -import jakarta.persistence.EntityTransaction; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.JoinTable; @@ -20,96 +18,94 @@ import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author Janario Oliveira * @author Gail Badner */ -public class SuperclassCollectionTest extends BaseEntityManagerFunctionalTestCase { - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { - PersonBaseBase.class, Person.class, OtherPerson.class, Address.class, - OtherSubclass.class - }; - } +@Jpa(annotatedClasses = { + SuperclassCollectionTest.PersonBaseBase.class, + SuperclassCollectionTest.Person.class, + SuperclassCollectionTest.OtherPerson.class, + SuperclassCollectionTest.Address.class, + SuperclassCollectionTest.OtherSubclass.class +}) +public class SuperclassCollectionTest { @Test - public void testPerson() { + public void testPerson(EntityManagerFactoryScope scope) { String address = "super-address"; String localAddress = "local-address"; - PersonBaseBase person = createPerson( new Person(), address, localAddress ); + PersonBaseBase person = createPerson( scope, new Person(), address, localAddress ); - assertAddress( person, address, localAddress ); + assertAddress( scope, person, address, localAddress ); } @Test - public void testOtherSubclass() { + public void testOtherSubclass(EntityManagerFactoryScope scope) { String address = "other-super-address"; String localAddress = "other-local-address"; - PersonBaseBase person = createPerson( new OtherSubclass(), address, localAddress ); + PersonBaseBase person = createPerson( scope, new OtherSubclass(), address, localAddress ); - assertAddress( person, address, localAddress ); + assertAddress( scope, person, address, localAddress ); } @Test @JiraKey( value = "HHH-10556") - public void testOtherPerson() { + public void testOtherPerson(EntityManagerFactoryScope scope) { String address = "other-person-super-address"; String localAddress = "other-person-local-address"; - PersonBaseBase person = createPerson( new OtherPerson(), address, localAddress ); + PersonBaseBase person = createPerson( scope, new OtherPerson(), address, localAddress ); - assertAddress( person, address, localAddress ); + assertAddress( scope, person, address, localAddress ); } - private void assertAddress(PersonBaseBase person, String address, String localAddress) { - List results = find( person.getClass(), person.id, "addresses" ); + private void assertAddress(EntityManagerFactoryScope scope, PersonBaseBase person, String address, String localAddress) { + List results = find( scope, person.getClass(), person.id, "addresses" ); assertEquals( 1, results.size() ); assertEquals( person.addresses.get( 0 ).id, ( (Address) results.get( 0 ) ).id ); assertEquals( address, ( (Address) results.get( 0 ) ).name ); - results = find( person.getClass(), person.id, "localAddresses" ); + results = find( scope, person.getClass(), person.id, "localAddresses" ); assertEquals( 1, results.size() ); assertEquals( person.getLocalAddresses().get( 0 ).id, ( (Address) results.get( 0 ) ).id ); assertEquals( localAddress, ( (Address) results.get( 0 ) ).name ); - getOrCreateEntityManager().close(); } - private PersonBaseBase createPerson(PersonBaseBase person, String address, String localAddress) { - EntityManager em = createEntityManager(); - EntityTransaction tx = em.getTransaction(); - tx.begin(); + private PersonBaseBase createPerson(EntityManagerFactoryScope scope, PersonBaseBase person, String address, String localAddress) { + PersonBaseBase personBaseBase; person.addresses.add( new Address( address ) ); person.getLocalAddresses().add( new Address( localAddress ) ); - person = em.merge( person ); - tx.commit(); - return person; + personBaseBase = scope.fromTransaction( entityManager -> entityManager.merge( person ) ); + return personBaseBase; } - private List find(Class clazz, int id, String path) { - EntityManager em = createEntityManager(); - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery(); - Root root = cq.from( clazz ); + private List find(EntityManagerFactoryScope scope, Class clazz, int id, String path) { + return scope.fromEntityManager( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(); + Root root = cq.from( clazz ); - cq.select( root.get( path ) ) - .where( cb.equal( root.get( "id" ), id ) ); + cq.select( root.get( path ) ) + .where( cb.equal( root.get( "id" ), id ) ); - TypedQuery query = em.createQuery( cq ); - return query.getResultList(); + TypedQuery query = entityManager.createQuery( cq ); + return query.getResultList(); + } ); } @Entity(name="Address") @@ -133,7 +129,7 @@ public abstract static class PersonBaseBase { @GeneratedValue Integer id; @OneToMany(cascade = CascadeType.ALL) - List
addresses = new ArrayList
(); + List
addresses = new ArrayList<>(); protected abstract List
getLocalAddresses(); } @@ -146,7 +142,7 @@ public abstract static class PersonBase extends PersonBaseBase { public static class Person extends PersonBase { @OneToMany(cascade = CascadeType.ALL) @JoinTable(name = "person_localaddress") - List
localAddresses = new ArrayList
(); + List
localAddresses = new ArrayList<>(); @Override public List
getLocalAddresses() { @@ -166,7 +162,7 @@ public static class OtherPerson extends OtherPersonBase { public static class OtherSubclass extends PersonBaseBase { @OneToMany(cascade = CascadeType.ALL) @JoinTable(name = "other_person_localaddress") - List
localAddresses = new ArrayList
(); + List
localAddresses = new ArrayList<>(); @Override public List
getLocalAddresses() { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/TreatJoinTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/TreatJoinTest.java index 9a994f5de399..50e1cb974a0b 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/TreatJoinTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/TreatJoinTest.java @@ -4,7 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria; -import java.util.List; import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; @@ -20,31 +19,39 @@ import jakarta.persistence.criteria.Join; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Before; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsInstanceOf.instanceOf; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author Andrea Boriero */ -public class TreatJoinTest extends BaseEntityManagerFunctionalTestCase { - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] {Item.class, Price.class, Book.class, Bid.class, Author.class, Car.class, Person.class}; - } - - @Before - public void setUp(){ - doInJPA( this::entityManagerFactory, entityManager -> { +@Jpa( + annotatedClasses = { + TreatJoinTest.Item.class, + TreatJoinTest.Price.class, + TreatJoinTest.Book.class, + TreatJoinTest.Bid.class, + TreatJoinTest.Author.class, + TreatJoinTest.Car.class, + TreatJoinTest.Person.class} +) +public class TreatJoinTest { + + @BeforeEach + public void setUp(EntityManagerFactoryScope scope){ + scope.inTransaction( entityManager -> { Price price = new Price( 10, "EUR" ); Author author = new Author( "Andrea Camilleri" ); Book book = new Book( author, "Il nipote del Negus", price ); @@ -58,10 +65,15 @@ public void setUp(){ } ); } + @AfterEach + public void cleanupTestData(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); + } + @Test @JiraKey(value = "HHH-8488") - public void testTreatJoin() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testTreatJoin(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery( String.class ); Root bid = query.from( Bid.class ); @@ -76,8 +88,8 @@ public void testTreatJoin() { @Test @JiraKey(value = "HHH-8488") - public void testTreatJoin2() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testTreatJoin2(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery( Bid.class ); Root bid = query.from( Bid.class ); @@ -95,8 +107,8 @@ public void testTreatJoin2() { @Test @JiraKey(value = "HHH-8488") - public void testJoinMethodOnATreatedJoin() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testJoinMethodOnATreatedJoin(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery( String.class ); Root bid = query.from( Bid.class ); @@ -117,8 +129,8 @@ public void testJoinMethodOnATreatedJoin() { @Test @JiraKey( value = "HHH-11081") - public void testTreatedJoinInWhereClause() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testTreatedJoinInWhereClause(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery( Bid.class ); Root bid = query.from( Bid.class ); @@ -134,8 +146,8 @@ public void testTreatedJoinInWhereClause() { @Test @JiraKey(value = "HHH-10561") - public void testJoinOnTreatedRoot() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testJoinOnTreatedRoot(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery criteria = cb.createQuery(Item.class); Root root = criteria.from(Item.class); @@ -153,8 +165,8 @@ public void testJoinOnTreatedRoot() { @Test @JiraKey(value = "HHH-10561") - public void testJoinOnTreatedRootWithJoin() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testJoinOnTreatedRootWithJoin(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery criteria = cb.createQuery(Item.class); Root root = criteria.from(Item.class); @@ -170,8 +182,8 @@ public void testJoinOnTreatedRootWithJoin() { @Test @JiraKey(value = "HHH-10767") - public void testJoinOnTreatedJoin() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testJoinOnTreatedJoin(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery criteria = cb.createQuery(Bid.class); Root root = criteria.from(Bid.class); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/TreatListJoinTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/TreatListJoinTest.java index 2b41aac9fbc2..d38279e7c4aa 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/TreatListJoinTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/TreatListJoinTest.java @@ -6,7 +6,6 @@ import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; -import jakarta.persistence.EntityManager; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.ManyToOne; @@ -23,29 +22,23 @@ import java.util.LinkedList; import java.util.List; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - -import org.junit.Before; -import org.junit.Test; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; /** * @author Andrea Boriero */ -public class TreatListJoinTest extends BaseEntityManagerFunctionalTestCase { - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] {TestEntity.class, EntityA.class, EntityB.class}; - } +@Jpa(annotatedClasses = {TreatListJoinTest.TestEntity.class, TreatListJoinTest.EntityA.class, TreatListJoinTest.EntityB.class}) +public class TreatListJoinTest { - @Before - public void setUp() { - EntityManager em = createEntityManager(); - try { - em.getTransaction().begin(); + @BeforeEach + public void setUp(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { for ( int i = 0; i < 5; i++ ) { TestEntity e = new TestEntity(); @@ -53,7 +46,7 @@ public void setUp() { eA.setParent( e ); eA.valueA = "a_" + i; - em.persist( e ); + entityManager.persist( e ); } for ( int i = 0; i < 5; i++ ) { TestEntity e = new TestEntity(); @@ -62,32 +55,21 @@ public void setUp() { eB.valueB = "b_" + i; eB.setParent( e ); - em.persist( e ); + entityManager.persist( e ); } - em.getTransaction().commit(); - } - catch (Exception e) { - if ( em.getTransaction().isActive() ) { - em.getTransaction().rollback(); - } - throw e; - } - finally { - em.close(); - } + } ); } @Test - public void testTreatJoin() { - EntityManager em = createEntityManager(); - try { - final CriteriaBuilder cb = em.getCriteriaBuilder(); + public void testTreatJoin(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); final CriteriaQuery query = cb.createTupleQuery(); final Root testEntity = query.from( TestEntity.class ); - final List> selections = new LinkedList(); + final List> selections = new LinkedList<>(); selections.add( testEntity.get( "id" ) ); final ListJoin entities = testEntity.joinList( @@ -117,12 +99,9 @@ public void testTreatJoin() { query.multiselect( selections ); - final List resultList = em.createQuery( query ).getResultList(); + final List resultList = entityManager.createQuery( query ).getResultList(); assertThat( resultList.size(), is( 10 ) ); - } - finally { - em.close(); - } + } ); } @MappedSuperclass diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/mapjoin/MapJoinEntryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/mapjoin/MapJoinEntryTest.java index d65a23744164..57198a677acb 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/mapjoin/MapJoinEntryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/mapjoin/MapJoinEntryTest.java @@ -4,53 +4,55 @@ */ package org.hibernate.orm.test.jpa.criteria.mapjoin; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertEquals; - -import java.util.List; -import java.util.Map; - import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.MapJoin; import jakarta.persistence.criteria.Root; - -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Before; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; -public class MapJoinEntryTest extends BaseEntityManagerFunctionalTestCase { +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; - @Override - public Class[] getAnnotatedClasses() { - return new Class[]{ Customer.class, CustomerOrder.class }; - } +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; - @Before - public void setup() { - doInJPA( this::entityManagerFactory, em -> { +@Jpa(annotatedClasses = {Customer.class, CustomerOrder.class}) +public class MapJoinEntryTest { + + @BeforeEach + public void setup(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Customer customer = new Customer(); customer.setName( "Morgan Philips" ); customer.addOrder( "online", "AA Glass Cleaner", 3 ); - em.persist( customer ); + entityManager.persist( customer ); } ); } + @AfterEach + public void cleanupTestData(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); + } + @Test @JiraKey(value = "HHH-12945") - public void testMapJoinEntryCriteria() { - doInJPA( this::entityManagerFactory, em -> { - CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); + public void testMapJoinEntryCriteria(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery query = criteriaBuilder.createQuery( Map.Entry.class ); Root customer = query.from( Customer.class ); MapJoin orderMap = customer.join( Customer_.orderMap ); query.select( orderMap.entry() ); - TypedQuery typedQuery = em.createQuery( query ); + TypedQuery typedQuery = entityManager.createQuery( query ); List resultList = typedQuery.getResultList(); assertEquals( 1, resultList.size() ); @@ -60,9 +62,9 @@ public void testMapJoinEntryCriteria() { } @Test - public void testMapJoinEntryJPQL() { - doInJPA( this::entityManagerFactory, em -> { - TypedQuery query = em.createQuery( "SELECT ENTRY(mp) FROM Customer c JOIN c.orderMap mp", + public void testMapJoinEntryJPQL(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + TypedQuery query = entityManager.createQuery( "SELECT ENTRY(mp) FROM Customer c JOIN c.orderMap mp", Map.Entry.class ); List resultList = query.getResultList(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/mapjoin/MapJoinTestWithEmbeddable.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/mapjoin/MapJoinWithEmbeddableTest.java similarity index 77% rename from hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/mapjoin/MapJoinTestWithEmbeddable.java rename to hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/mapjoin/MapJoinWithEmbeddableTest.java index 76e9a2d707e4..02635cb1e775 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/mapjoin/MapJoinTestWithEmbeddable.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/mapjoin/MapJoinWithEmbeddableTest.java @@ -25,26 +25,22 @@ import jakarta.persistence.criteria.MapJoin; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; +import org.junit.jupiter.api.Test; /** * @author Christian Beikov */ -public class MapJoinTestWithEmbeddable extends BaseEntityManagerFunctionalTestCase { - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] {Batch.class, Node.class, BatchNodeMetadata.class}; - } +@Jpa(annotatedClasses = {MapJoinWithEmbeddableTest.Batch.class, MapJoinWithEmbeddableTest.Node.class, MapJoinWithEmbeddableTest.BatchNodeMetadata.class}) +public class MapJoinWithEmbeddableTest { @Test @JiraKey( value = "HHH-10455" ) - public void testSelectingKeyOfMapJoin() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testSelectingKeyOfMapJoin(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery( Node.class ); Root root = query.from( Batch.class ); @@ -60,8 +56,8 @@ public void testSelectingKeyOfMapJoin() { @Test @JiraKey( value = "HHH-10229" ) - public void testSelectingValueOfMapJoin() { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testSelectingValueOfMapJoin(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery( BatchNodeMetadata.class ); Root root = query.from( Batch.class ); @@ -107,18 +103,18 @@ public static class BatchNodeMetadata implements Serializable { @Column(nullable = false) @Enumerated(EnumType.STRING) - private NodeMigration migrering = NodeMigration.TOTAL; + private NodeMigration migration = NodeMigration.TOTAL; - public NodeMigration getMigrering() { - return migrering; + public NodeMigration getMigration() { + return migration; } - public void setMigrering(NodeMigration migrering) { - this.migrering = migrering; + public void setMigration(NodeMigration migration) { + this.migration = migration; } } - public static enum NodeMigration { + public enum NodeMigration { TOTAL } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/nulliteral/CriteriaLiteralInSelectExpressionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/nulliteral/CriteriaLiteralInSelectExpressionTest.java index 9896167f175b..7086cff89317 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/nulliteral/CriteriaLiteralInSelectExpressionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/nulliteral/CriteriaLiteralInSelectExpressionTest.java @@ -86,7 +86,7 @@ public void testNullLiteral(EntityManagerFactoryScope scope) { entityManager -> { final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); final CriteriaQuery query = criteriaBuilder.createQuery( MyEntityDTO.class ); - final Root entity = query.from( MyEntity.class ); + query.from( MyEntity.class ); query.multiselect( criteriaBuilder.literal( false ), criteriaBuilder.nullLiteral( String.class ) ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/nulliteral/CriteriaLiteralsTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/nulliteral/CriteriaLiteralsTest.java index f6ce91a1699d..441ad180d705 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/nulliteral/CriteriaLiteralsTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/nulliteral/CriteriaLiteralsTest.java @@ -4,9 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria.nulliteral; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; import jakarta.persistence.CascadeType; import jakarta.persistence.Entity; import jakarta.persistence.EntityManager; @@ -24,41 +21,39 @@ import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.H2Dialect; import org.hibernate.exception.SQLGrammarException; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; +import org.hibernate.testing.jdbc.SQLStatementInspector; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.RequiresDialect; +import org.hibernate.testing.orm.junit.Setting; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; -import org.hibernate.testing.RequiresDialect; -import org.hibernate.testing.jdbc.SQLStatementInterceptor; -import org.junit.Before; -import org.junit.Test; +import java.util.ArrayList; +import java.util.List; -import static java.lang.Boolean.FALSE; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author Vlad Mihalcea */ @RequiresDialect(H2Dialect.class) -public class CriteriaLiteralsTest extends BaseEntityManagerFunctionalTestCase { - - private SQLStatementInterceptor sqlStatementInterceptor; - - @Override - protected void addConfigOptions(Map options) { - sqlStatementInterceptor = new SQLStatementInterceptor( options ); - options.put( AvailableSettings.DIALECT_NATIVE_PARAM_MARKERS, FALSE ); - } - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { Book.class, Author.class }; - } - - @Before - public void init() { - doInJPA( this::entityManagerFactory, entityManager -> { +@Jpa( + annotatedClasses = {CriteriaLiteralsTest.Book.class, CriteriaLiteralsTest.Author.class}, + integrationSettings = @Setting(name = AvailableSettings.DIALECT_NATIVE_PARAM_MARKERS, value = "false"), + useCollectingStatementInspector = true +) +public class CriteriaLiteralsTest { + + private SQLStatementInspector sqlStatementInspector; + + @BeforeEach + public void init(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Book book = new Book(); book.name = "Java Persistence with Hibernate"; @@ -66,38 +61,36 @@ public void init() { author1.name = "Christian Bauer"; Author author2 = new Author(); - author1.name = "Gavin Ling"; + author2.name = "Gavin Ling"; book.authors.add( author1 ); book.authors.add( author2 ); entityManager.persist( book ); } ); - try { - doInJPA( this::entityManagerFactory, entityManager -> { - entityManager - .createNativeQuery( - "SELECT REPEAT('abc' || ' ', 1000000000000) FROM MY_ENTITY" ) - .getSingleResult(); - } ); - fail( "Should have thrown exception!" ); - } - catch ( Exception expected ) { - assertEquals( + scope.inTransaction( entityManager -> + assertThrows( SQLGrammarException.class, - expected.getClass() - ); - } + () -> entityManager.createNativeQuery("SELECT REPEAT('abc' || ' ', 1000000000000) FROM MY_ENTITY" ) + .getSingleResult(), + "Should have thrown exception!" + ) + ); + + sqlStatementInspector = scope.getCollectingStatementInspector(); + sqlStatementInspector.clear(); } - @Test - public void testLiteralsInWhereClause() throws Exception { + @AfterEach + public void cleanupTestData(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); + } - doInJPA( this::entityManagerFactory, entityManager -> { + @Test + public void testLiteralsInWhereClause(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); - final CriteriaQuery query = cb.createQuery( Tuple.class ); - final Root entity = query.from( Book.class ); query.where( cb.equal( entity.get( "name" ), @@ -110,45 +103,41 @@ public void testLiteralsInWhereClause() throws Exception { entity.get( "name" ) ); - sqlStatementInterceptor.clear(); + sqlStatementInspector.clear(); List tuples = entityManager.createQuery( query ) .getResultList(); - assertEquals( - 1, - sqlStatementInterceptor.getSqlQueries().size() - ); - sqlStatementInterceptor.assertExecuted("select 'abc',b1_0.name from Book b1_0 where b1_0.name='( SELECT REPEAT(''abc'' || '' '', 10000000000 FROM MY_ENTITY )'"); + assertEquals( 1, sqlStatementInspector.getSqlQueries().size() ); + sqlStatementInspector.assertExecuted("select 'abc',b1_0.name from Book b1_0 where b1_0.name='( SELECT REPEAT(''abc'' || '' '', 10000000000 FROM MY_ENTITY )'"); assertTrue( tuples.isEmpty() ); } ); } @Test - public void testNumericLiteralsInWhereClause() throws Exception { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNumericLiteralsInWhereClause(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> testNumericLiterals( entityManager, "select 'abc',b1_0.name from Book b1_0 where b1_0.id=1" - ); - } ); + ) + ); } @Test - public void testNumericLiteralsInWhereClauseUsingBindParameters() throws Exception { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testNumericLiteralsInWhereClauseUsingBindParameters(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> testNumericLiterals( entityManager, "select 'abc',b1_0.name from Book b1_0 where b1_0.id=1" - ); - } ); + ) + ); } private void testNumericLiterals(EntityManager entityManager, String expectedSQL) { final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); - final CriteriaQuery query = cb.createQuery( Tuple.class ); - final Root entity = query.from( Book.class ); + query.where( cb.equal( entity.get( "id" ), cb.literal( 1 ) @@ -159,17 +148,17 @@ private void testNumericLiterals(EntityManager entityManager, String expectedSQL entity.get( "name" ) ); - sqlStatementInterceptor.clear(); + sqlStatementInspector.clear(); List tuples = entityManager.createQuery( query ).getResultList(); assertEquals( 1, tuples.size() ); - sqlStatementInterceptor.assertExecuted( expectedSQL ); + sqlStatementInspector.assertExecuted( expectedSQL ); } @Test - public void testCriteriaParameters() throws Exception { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testCriteriaParameters(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery( String.class ); Root root = query.from( Book.class ); @@ -181,23 +170,22 @@ public void testCriteriaParameters() throws Exception { ), cb.equal( authors.index(), 0 ) ) .select( authors.get( "name" ) ); - sqlStatementInterceptor.clear(); + sqlStatementInspector.clear(); + entityManager.createQuery( query ).getResultList(); - assertEquals( - 1, - sqlStatementInterceptor.getSqlQueries().size() - ); - sqlStatementInterceptor.assertExecuted( "select a1_0.name from Book b1_0 join Author a1_0 on b1_0.id=a1_0.book_id where b1_0.name=? and a1_0.index_id=?" ); + assertEquals( 1, sqlStatementInspector.getSqlQueries().size() ); + + sqlStatementInspector.assertExecuted( "select a1_0.name from Book b1_0 join Author a1_0 on b1_0.id=a1_0.book_id where b1_0.name=? and a1_0.index_id=?" ); } ); } @Test - public void testLiteralsInSelectClause() throws Exception { - doInJPA( this::entityManagerFactory, entityManager -> { + public void testLiteralsInSelectClause(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery( String.class ); Root root = query.from( Book.class ); - ListJoin authors = root.joinList( "authors" ); + root.joinList( "authors" ); query.where( cb.equal( root.get( "name" ), diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/query/LimitExpressionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/query/LimitExpressionTest.java index 7041668a6132..d7676f7fa561 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/query/LimitExpressionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/query/LimitExpressionTest.java @@ -4,52 +4,52 @@ */ package org.hibernate.orm.test.jpa.criteria.query; -import java.util.List; import jakarta.persistence.Entity; -import jakarta.persistence.EntityManager; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.criteria.CriteriaQuery; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.hibernate.testing.transaction.TransactionUtil; -import org.junit.Before; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; -import static junit.framework.TestCase.assertTrue; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; /** * @author Andrea Boriero */ - -public class LimitExpressionTest extends BaseEntityManagerFunctionalTestCase { - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] {Person.class}; - } +@Jpa(annotatedClasses = {LimitExpressionTest.Person.class}) +public class LimitExpressionTest { @Test @JiraKey(value = "HHH-11278") - public void testAnEmptyListIsReturnedWhenSetMaxResultsToZero() { - TransactionUtil.doInJPA( this::entityManagerFactory, (EntityManager entityManager) -> { + public void testAnEmptyListIsReturnedWhenSetMaxResultsToZero(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { final CriteriaQuery query = entityManager.getCriteriaBuilder().createQuery( Person.class ); query.from( Person.class ); - final List list = entityManager.createQuery( query ).setMaxResults( 0 ).getResultList(); - assertTrue( "The list should be empty with setMaxResults 0", list.isEmpty() ); + final List list = entityManager.createQuery( query ).setMaxResults( 0 ).getResultList(); + Assertions.assertTrue( list.isEmpty(), "The list should be empty with setMaxResults 0" ); } ); } - @Before - public void prepareTest() throws Exception { - TransactionUtil.doInJPA( this::entityManagerFactory, entityManager -> { + @BeforeEach + public void prepareTest(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Person p = new Person(); entityManager.persist( p ); } ); } + @AfterEach + public void cleanupTestData(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); + } + @Entity(name = "Person") public static class Person { @Id diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/selectcase/SelectCaseLiteralHandlingBindTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/selectcase/SelectCaseLiteralHandlingBindTest.java index efc293d9fa0b..2c471a4c1c71 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/selectcase/SelectCaseLiteralHandlingBindTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/selectcase/SelectCaseLiteralHandlingBindTest.java @@ -4,8 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria.selectcase; -import java.util.List; -import java.util.Map; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Tuple; @@ -15,15 +13,16 @@ import jakarta.persistence.criteria.Root; import org.hibernate.cfg.AvailableSettings; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; -import org.hibernate.query.criteria.ValueHandlingMode; - +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.Setting; +import org.junit.jupiter.api.Test; + +import java.util.List; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Tests query rendering and execution @@ -40,17 +39,16 @@ * * @author Fabio Massimo Ercoli */ -public class SelectCaseLiteralHandlingBindTest extends BaseEntityManagerFunctionalTestCase { - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] { Programmer.class }; - } +@Jpa( + annotatedClasses = {SelectCaseLiteralHandlingBindTest.Programmer.class}, + integrationSettings = {@Setting(name = AvailableSettings.CRITERIA_VALUE_HANDLING_MODE, + value = "BIND")} +) +public class SelectCaseLiteralHandlingBindTest { @Test - public void selectCaseExpression() { - - doInJPA( this::entityManagerFactory, entityManager -> { + public void selectCaseExpression(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createTupleQuery(); Root programmer = query.from( Programmer.class ); @@ -73,9 +71,8 @@ public void selectCaseExpression() { @Test @JiraKey(value = "HHH-13001") - public void selectSumOnCaseExpression() { - - doInJPA( this::entityManagerFactory, entityManager -> { + public void selectSumOnCaseExpression(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createTupleQuery(); Root programmer = query.from( Programmer.class ); @@ -99,9 +96,8 @@ public void selectSumOnCaseExpression() { } @Test - public void whereCaseExpression() { - - doInJPA( this::entityManagerFactory, entityManager -> { + public void whereCaseExpression(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery(Programmer.class); Root programmer = query.from( Programmer.class ); @@ -122,13 +118,6 @@ public void whereCaseExpression() { } ); } - @Override - protected Map getConfig() { - Map config = super.getConfig(); - config.put( AvailableSettings.CRITERIA_VALUE_HANDLING_MODE, ValueHandlingMode.BIND ); - return config; - } - @Entity(name = "Programmer") public static class Programmer { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/selectcase/SelectCaseTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/selectcase/SelectCaseTest.java index d3c52a206391..4381947b9447 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/selectcase/SelectCaseTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/selectcase/SelectCaseTest.java @@ -4,10 +4,7 @@ */ package org.hibernate.orm.test.jpa.criteria.selectcase; -import java.util.List; - import jakarta.persistence.Column; -import jakarta.persistence.EntityManager; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; import jakarta.persistence.Id; @@ -17,86 +14,88 @@ import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; - +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; +import org.junit.jupiter.api.Test; -@JiraKey( value = "HHH-9731" ) -public class SelectCaseTest extends BaseEntityManagerFunctionalTestCase { - - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] {Entity.class}; - } +@JiraKey(value = "HHH-9731") +@Jpa(annotatedClasses = {SelectCaseTest.Entity.class}) +public class SelectCaseTest { @Test - public void selectCaseWithValuesShouldWork() { - EntityManager entityManager = getOrCreateEntityManager(); - CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + public void selectCaseWithValuesShouldWork(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); - CriteriaBuilder.Case selectCase = cb.selectCase(); - Predicate somePredicate = cb.equal( cb.literal( 1 ), 1 ); - selectCase.when( somePredicate, EnumValue.VALUE_1 ); - selectCase.otherwise( EnumValue.VALUE_2 ); + CriteriaBuilder.Case selectCase = cb.selectCase(); + Predicate somePredicate = cb.equal( cb.literal( 1 ), 1 ); + selectCase.when( somePredicate, EnumValue.VALUE_1 ); + selectCase.otherwise( EnumValue.VALUE_2 ); - CriteriaQuery query = cb.createQuery( Entity.class ); - Root from = query.from( Entity.class ); - query.select( from ).where( cb.equal( from.get( "value" ), selectCase ) ); + CriteriaQuery query = cb.createQuery( Entity.class ); + Root from = query.from( Entity.class ); + query.select( from ).where( cb.equal( from.get( "value" ), selectCase ) ); - entityManager.createQuery( query ).getResultList(); + entityManager.createQuery( query ).getResultList(); + } ); } @Test - public void selectCaseWithCastedTypeValuesShouldWork() { - EntityManager entityManager = getOrCreateEntityManager(); + public void selectCaseWithCastedTypeValuesShouldWork(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { - CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); - CriteriaBuilder.Case selectCase = cb.selectCase(); - Predicate somePredicate = cb.equal( cb.literal( 1 ), 1 ); - selectCase.when( somePredicate, EnumValue.VALUE_1.name() ); - selectCase.otherwise( EnumValue.VALUE_2.name() ); + CriteriaBuilder.Case selectCase = cb.selectCase(); + Predicate somePredicate = cb.equal( cb.literal( 1 ), 1 ); + selectCase.when( somePredicate, EnumValue.VALUE_1.name() ); + selectCase.otherwise( EnumValue.VALUE_2.name() ); - CriteriaQuery query = cb.createQuery( Entity.class ); - Root from = query.from( Entity.class ); - query.select( from ).where( cb.equal( from.get( "value" ).as( String.class ), selectCase.as( String.class ) ) ); + CriteriaQuery query = cb.createQuery( Entity.class ); + Root from = query.from( Entity.class ); + query.select( from ) + .where( cb.equal( from.get( "value" ).as( String.class ), selectCase.as( String.class ) ) ); - entityManager.createQuery( query ).getResultList(); + entityManager.createQuery( query ).getResultList(); + } ); } @Test - public void simpleSelectCaseWithValuesShouldWork() { - EntityManager entityManager = getOrCreateEntityManager(); + public void simpleSelectCaseWithValuesShouldWork(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { - CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); - CriteriaBuilder.SimpleCase selectCase = cb.selectCase( cb.literal( 1 ) ); - selectCase.when( 1, EnumValue.VALUE_1 ); - selectCase.otherwise( EnumValue.VALUE_2 ); + CriteriaBuilder.SimpleCase selectCase = cb.selectCase( cb.literal( 1 ) ); + selectCase.when( 1, EnumValue.VALUE_1 ); + selectCase.otherwise( EnumValue.VALUE_2 ); - CriteriaQuery query = cb.createQuery( Entity.class ); - Root from = query.from( Entity.class ); - query.select( from ).where( cb.equal( from.get( "value" ), selectCase ) ); + CriteriaQuery query = cb.createQuery( Entity.class ); + Root from = query.from( Entity.class ); + query.select( from ).where( cb.equal( from.get( "value" ), selectCase ) ); - List result = entityManager.createQuery( query ).getResultList(); + entityManager.createQuery( query ).getResultList(); + } ); } @Test - public void simpleSelectCaseWithCastedTypeValuesShouldWork() { - EntityManager entityManager = getOrCreateEntityManager(); + public void simpleSelectCaseWithCastedTypeValuesShouldWork(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { - CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); - CriteriaBuilder.SimpleCase selectCase = cb.selectCase( cb.literal( 1 ) ); - selectCase.when( 1, EnumValue.VALUE_1.name() ); - selectCase.otherwise( EnumValue.VALUE_2.name() ); + CriteriaBuilder.SimpleCase selectCase = cb.selectCase( cb.literal( 1 ) ); + selectCase.when( 1, EnumValue.VALUE_1.name() ); + selectCase.otherwise( EnumValue.VALUE_2.name() ); - CriteriaQuery query = cb.createQuery( Entity.class ); - Root from = query.from( Entity.class ); - query.select( from ).where( cb.equal( from.get( "value" ).as( String.class ), selectCase.as( String.class ) ) ); + CriteriaQuery query = cb.createQuery( Entity.class ); + Root from = query.from( Entity.class ); + query.select( from ) + .where( cb.equal( from.get( "value" ).as( String.class ), selectCase.as( String.class ) ) ); - entityManager.createQuery( query ).getResultList(); + entityManager.createQuery( query ).getResultList(); + } ); } @jakarta.persistence.Entity @@ -113,6 +112,6 @@ public static class Entity { public enum EnumValue { VALUE_1, - VALUE_2; + VALUE_2 } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/simplecase/BasicSimpleCaseTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/simplecase/BasicSimpleCaseTest.java index 7fb12ecd831b..9ff19feeb457 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/simplecase/BasicSimpleCaseTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/simplecase/BasicSimpleCaseTest.java @@ -4,17 +4,10 @@ */ package org.hibernate.orm.test.jpa.criteria.simplecase; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; - -import java.util.List; - import jakarta.persistence.AttributeConverter; import jakarta.persistence.Column; import jakarta.persistence.Convert; import jakarta.persistence.Entity; -import jakarta.persistence.EntityManager; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.Table; @@ -26,10 +19,18 @@ import jakarta.persistence.criteria.Path; import jakarta.persistence.criteria.Root; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; -import org.hibernate.testing.FailureExpected; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.FailureExpected; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; /** * Mote that these are simply performing syntax checking (can the criteria query @@ -37,200 +38,201 @@ * * @author Steve Ebersole */ -public class BasicSimpleCaseTest extends BaseEntityManagerFunctionalTestCase { +@Jpa(annotatedClasses = {BasicSimpleCaseTest.Customer.class, BasicSimpleCaseTest.TestEntity.class}) +public class BasicSimpleCaseTest { - @Override - protected Class[] getAnnotatedClasses() { - return new Class[] {Customer.class, TestEntity.class}; + @AfterEach + public void cleanupTestData(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); } @Test @JiraKey(value = "HHH-9343") - public void testCaseStringResult() { - EntityManager em = getOrCreateEntityManager(); - CriteriaBuilder builder = em.getCriteriaBuilder(); + public void testCaseStringResult(EntityManagerFactoryScope scope) { + scope.inEntityManager( entityManager -> { + CriteriaBuilder builder = entityManager.getCriteriaBuilder(); - CriteriaQuery query = builder.createTupleQuery(); - Root root = query.from( Customer.class ); + CriteriaQuery query = builder.createTupleQuery(); + Root root = query.from( Customer.class ); - Path emailPath = root.get( "email" ); - CriteriaBuilder.Case selectCase = builder.selectCase(); - selectCase.when( builder.greaterThan( builder.length( emailPath ), 13 ), "Long" ); - selectCase.when( builder.greaterThan( builder.length( emailPath ), 12 ), "Normal" ); - Expression emailType = selectCase.otherwise( "Unknown" ); + Path emailPath = root.get( "email" ); + CriteriaBuilder.Case selectCase = builder.selectCase(); + selectCase.when( builder.greaterThan( builder.length( emailPath ), 13 ), "Long" ); + selectCase.when( builder.greaterThan( builder.length( emailPath ), 12 ), "Normal" ); + Expression emailType = selectCase.otherwise( "Unknown" ); - query.multiselect( emailPath, emailType ); + query.multiselect( emailPath, emailType ); - em.createQuery( query ).getResultList(); + entityManager.createQuery( query ).getResultList(); + } ); } @Test @JiraKey(value = "HHH-9343") - public void testCaseIntegerResult() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); + public void testCaseIntegerResult(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { - CriteriaBuilder builder = em.getCriteriaBuilder(); + CriteriaBuilder builder = entityManager.getCriteriaBuilder(); - CriteriaQuery query = builder.createTupleQuery(); - Root root = query.from( Customer.class ); + CriteriaQuery query = builder.createTupleQuery(); + Root root = query.from( Customer.class ); - Path emailPath = root.get( "email" ); - CriteriaBuilder.Case selectCase = builder.selectCase(); - selectCase.when( builder.greaterThan( builder.length( emailPath ), 13 ), 2 ); - selectCase.when( builder.greaterThan( builder.length( emailPath ), 12 ), 1 ); - Expression emailType = selectCase.otherwise( 0 ); + Path emailPath = root.get( "email" ); + CriteriaBuilder.Case selectCase = builder.selectCase(); + selectCase.when( builder.greaterThan( builder.length( emailPath ), 13 ), 2 ); + selectCase.when( builder.greaterThan( builder.length( emailPath ), 12 ), 1 ); + Expression emailType = selectCase.otherwise( 0 ); - query.multiselect( emailPath, emailType ); + query.multiselect( emailPath, emailType ); - em.createQuery( query ).getResultList(); + entityManager.createQuery( query ).getResultList(); + } ); } @Test @JiraKey(value = "HHH-9343") - public void testCaseLiteralResult() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery( Boolean.class ); - Root expense_ = cq.from( Customer.class ); - em.createQuery( - cq.distinct( true ).where( - cb.equal( expense_.get( "email" ), "@hibernate.com" ) - ).multiselect( - cb.selectCase() - .when( cb.gt( cb.count( expense_ ), cb.literal( 0L ) ), cb.literal( true ) ) - .otherwise( cb.literal( false ) ) - ) - ).getSingleResult(); + public void testCaseLiteralResult(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery( Boolean.class ); + Root expense_ = cq.from( Customer.class ); + entityManager.createQuery( + cq.distinct( true ).where( + cb.equal( expense_.get( "email" ), "@hibernate.com" ) + ).multiselect( + cb.selectCase() + .when( cb.gt( cb.count( expense_ ), cb.literal( 0L ) ), cb.literal( true ) ) + .otherwise( cb.literal( false ) ) + ) + ).getSingleResult(); + } ); } @Test @JiraKey(value = "HHH-9343") - public void testCaseLiteralResult2() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery( Boolean.class ); - Root expense_ = cq.from( Customer.class ); - em.createQuery( - cq.distinct( true ).where( - cb.equal( expense_.get( "email" ), "@hibernate.com" ) - ).multiselect( - cb.selectCase() - .when( cb.gt( cb.count( expense_ ), cb.literal( 0L ) ), true ) - .otherwise( false ) - ) - ).getSingleResult(); + public void testCaseLiteralResult2(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery( Boolean.class ); + Root expense_ = cq.from( Customer.class ); + entityManager.createQuery( + cq.distinct( true ).where( + cb.equal( expense_.get( "email" ), "@hibernate.com" ) + ).multiselect( + cb.selectCase() + .when( cb.gt( cb.count( expense_ ), cb.literal( 0L ) ), true ) + .otherwise( false ) + ) + ).getSingleResult(); + } ); } @Test - public void testCaseInOrderBy() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaBuilder builder = em.getCriteriaBuilder(); + public void testCaseInOrderBy(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { - CriteriaQuery query = builder.createQuery( Customer.class ); - Root root = query.from( Customer.class ); - query.select( root ); + CriteriaBuilder builder = entityManager.getCriteriaBuilder(); - Path emailPath = root.get( "email" ); - SimpleCase orderCase = builder.selectCase( emailPath ); - orderCase = orderCase.when( "test@test.com", 1 ); - orderCase = orderCase.when( "test2@test.com", 2 ); + CriteriaQuery query = builder.createQuery( Customer.class ); + Root root = query.from( Customer.class ); + query.select( root ); - query.orderBy( builder.asc( orderCase.otherwise( 0 ) ) ); + Path emailPath = root.get( "email" ); + SimpleCase orderCase = builder.selectCase( emailPath ); + orderCase = orderCase.when( "test@test.com", 1 ); + orderCase = orderCase.when( "test2@test.com", 2 ); - em.createQuery( query ); + query.orderBy( builder.asc( orderCase.otherwise( 0 ) ) ); + entityManager.createQuery( query ); + } ); } @Test - public void testCaseInOrderBy2() { - EntityManager em = getOrCreateEntityManager(); - em.getTransaction().begin(); - - CriteriaBuilder builder = em.getCriteriaBuilder(); + public void testCaseInOrderBy2(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { - CriteriaQuery query = builder.createQuery( Customer.class ); - Root root = query.from( Customer.class ); - query.select( root ); + CriteriaBuilder builder = entityManager.getCriteriaBuilder(); - Path emailPath = root.get( "email" ); - SimpleCase orderCase = builder.selectCase( emailPath ); - orderCase = orderCase.when( "test@test.com", "a" ); - orderCase = orderCase.when( "test2@test.com", "b" ); + CriteriaQuery query = builder.createQuery( Customer.class ); + Root root = query.from( Customer.class ); + query.select( root ); - query.orderBy( builder.asc( orderCase.otherwise( "c" ) ) ); + Path emailPath = root.get( "email" ); + SimpleCase orderCase = builder.selectCase( emailPath ); + orderCase = orderCase.when( "test@test.com", "a" ); + orderCase = orderCase.when( "test2@test.com", "b" ); - em.createQuery( query ); + query.orderBy( builder.asc( orderCase.otherwise( "c" ) ) ); + entityManager.createQuery( query ); + } ); } @Test @JiraKey(value = "HHH-13016") @FailureExpected(jiraKey = "HHH-13016") - public void testCaseEnumResult() { - doInJPA( this::entityManagerFactory, em -> { + public void testCaseEnumResult(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { // create entities Customer customer1 = new Customer(); customer1.setEmail( "LONG5678901234" ); - em.persist( customer1 ); + entityManager.persist( customer1 ); Customer customer2 = new Customer(); customer2.setEmail( "NORMAL7890123" ); - em.persist( customer2 ); + entityManager.persist( customer2 ); Customer customer3 = new Customer(); customer3.setEmail( "UNKNOWN" ); - em.persist( customer3 ); + entityManager.persist( customer3 ); }); - EntityManager em = getOrCreateEntityManager(); - CriteriaBuilder builder = em.getCriteriaBuilder(); - - CriteriaQuery query = builder.createTupleQuery(); - Root root = query.from( Customer.class ); - - Path emailPath = root.get( "email" ); - CriteriaBuilder.Case selectCase = builder.selectCase(); - selectCase.when( builder.greaterThan( builder.length( emailPath ), 13 ), EmailType.LONG ); - selectCase.when( builder.greaterThan( builder.length( emailPath ), 12 ), EmailType.NORMAL ); - Expression emailType = selectCase.otherwise( EmailType.UNKNOWN ); - - query.multiselect( emailPath, emailType ); - query.orderBy( builder.asc( emailPath ) ); - - List results = em.createQuery( query ).getResultList(); - assertEquals( 3, results.size() ); - assertEquals( "LONG5678901234", results.get( 0 ).get( 0 ) ); - assertEquals( EmailType.LONG, results.get( 0 ).get( 1 ) ); - assertEquals( "NORMAL7890123", results.get( 1 ).get( 0 ) ); - assertEquals( EmailType.NORMAL, results.get( 1 ).get( 1 ) ); - assertEquals( "UNKNOWN", results.get( 2 ).get( 0 ) ); - assertEquals( EmailType.UNKNOWN, results.get( 2 ).get( 1 ) ); + scope.inEntityManager( entityManager -> { + CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + + CriteriaQuery query = builder.createTupleQuery(); + Root root = query.from( Customer.class ); + + Path emailPath = root.get( "email" ); + CriteriaBuilder.Case selectCase = builder.selectCase(); + selectCase.when( builder.greaterThan( builder.length( emailPath ), 13 ), EmailType.LONG ); + selectCase.when( builder.greaterThan( builder.length( emailPath ), 12 ), EmailType.NORMAL ); + Expression emailType = selectCase.otherwise( EmailType.UNKNOWN ); + + query.multiselect( emailPath, emailType ); + query.orderBy( builder.asc( emailPath ) ); + + List results = entityManager.createQuery( query ).getResultList(); + assertEquals( 3, results.size() ); + assertEquals( "LONG5678901234", results.get( 0 ).get( 0 ) ); + assertEquals( EmailType.LONG, results.get( 0 ).get( 1 ) ); + assertEquals( "NORMAL7890123", results.get( 1 ).get( 0 ) ); + assertEquals( EmailType.NORMAL, results.get( 1 ).get( 1 ) ); + assertEquals( "UNKNOWN", results.get( 2 ).get( 0 ) ); + assertEquals( EmailType.UNKNOWN, results.get( 2 ).get( 1 ) ); + } ); } @Test @JiraKey(value = "HHH-13199") - public void testCaseEnumInSum() throws Exception { - doInJPA( this::entityManagerFactory, em -> { + public void testCaseEnumInSum(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { // create entities TestEntity e1 = new TestEntity(); e1.setEnumField( TestEnum.VAL_1 ); e1.setValue( 20L ); - em.persist( e1 ); + entityManager.persist( e1 ); TestEntity e2 = new TestEntity(); e2.setEnumField( TestEnum.VAL_2 ); e2.setValue( 10L ); - em.persist( e2 ); + entityManager.persist( e2 ); } ); - doInJPA( this::entityManagerFactory, em -> { + scope.inTransaction( entityManager -> { // Works in previous version (e.g. Hibernate 5.3.7.Final) // Fails in Hibernate 5.4.0.Final - CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createTupleQuery(); Root r = query.from( TestEntity.class ); @@ -256,7 +258,7 @@ public void testCaseEnumInSum() throws Exception { cb.sum( case2 ).alias( "VAL_2" ) ) ) .groupBy( r. get( "enumField" ) ); - List list = em.createQuery( query ).getResultList(); + List list = entityManager.createQuery( query ).getResultList(); assertEquals( 2, list.size() ); for ( Tuple tuple : list ) { TestEnum enumVal = tuple.get( "enumField", TestEnum.class ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/AbstractSubqueryInSelectClauseTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/AbstractSubqueryInSelectClauseTest.java index 3a472caa68e2..1fe2b06ec570 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/AbstractSubqueryInSelectClauseTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/AbstractSubqueryInSelectClauseTest.java @@ -4,8 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria.subquery; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; - import java.util.HashMap; import java.util.Map; @@ -17,19 +15,15 @@ import jakarta.persistence.MapKeyColumn; import jakarta.persistence.OneToMany; -import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase; -import org.junit.Before; - -public abstract class AbstractSubqueryInSelectClauseTest extends BaseEntityManagerFunctionalTestCase { +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; - @Override - protected Class[] getAnnotatedClasses() { - return new Class[]{ Person.class, Document.class }; - } +public abstract class AbstractSubqueryInSelectClauseTest { - @Before - public void initData() { - doInJPA( this::entityManagerFactory, em -> { + @BeforeEach + public void initData(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { Person p1 = new Person(); Person p2 = new Person(); Document d = new Document(); @@ -42,18 +36,23 @@ public void initData() { d.getContacts().put( 1, p1 ); d.getContacts().put( 2, p2 ); - em.persist( p1 ); - em.persist( p2 ); - em.persist( d ); + entityManager.persist( p1 ); + entityManager.persist( p2 ); + entityManager.persist( d ); } ); } + @AfterEach + public void cleanupTestData(EntityManagerFactoryScope scope) { + scope.getEntityManagerFactory().getSchemaManager().truncate(); + } + @Entity(name = "Document") public static class Document { private Integer id; - private Map contacts = new HashMap(); + private Map contacts = new HashMap<>(); @Id @GeneratedValue @@ -82,7 +81,7 @@ public static class Person { private Integer id; - private Map localized = new HashMap(); + private Map localized = new HashMap<>(); @Id @GeneratedValue diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/SubqueryInSelectClauseJpaComplianceTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/SubqueryInSelectClauseJpaComplianceTest.java index d10fd437e159..0e122accd5a7 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/SubqueryInSelectClauseJpaComplianceTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/SubqueryInSelectClauseJpaComplianceTest.java @@ -4,10 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria.subquery; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; - -import java.util.Map; - import jakarta.persistence.Tuple; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; @@ -17,33 +13,42 @@ import jakarta.persistence.criteria.Subquery; import org.hibernate.cfg.AvailableSettings; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.Setting; -@JiraKey(value = "HHH-13111") -public class SubqueryInSelectClauseJpaComplianceTest extends AbstractSubqueryInSelectClauseTest { +import org.junit.jupiter.api.Test; - @Override - @SuppressWarnings({ "unchecked", "rawtypes" }) - protected void addConfigOptions(Map options) { - options.put( AvailableSettings.JPA_QUERY_COMPLIANCE, true ); - } +import static org.junit.jupiter.api.Assertions.assertThrows; - @Test(expected = IllegalStateException.class) - public void testSubqueryInSelectClause() { - doInJPA( this::entityManagerFactory, em -> { - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery query = cb.createTupleQuery(); - Root document = query.from( Document.class ); - Join contacts = document.join( "contacts", JoinType.LEFT ); - - Subquery personCount = query.subquery( Long.class ); - Root person = personCount.from( Person.class ); - personCount.select( cb.count( person ) ).where( cb.equal( contacts.get( "id" ), person.get( "id" ) ) ); - - query.multiselect( document.get( "id" ), personCount.getSelection() ); +@JiraKey(value = "HHH-13111") +@Jpa( + annotatedClasses = {AbstractSubqueryInSelectClauseTest.Person.class, AbstractSubqueryInSelectClauseTest.Document.class}, + integrationSettings = {@Setting(name = AvailableSettings.JPA_QUERY_COMPLIANCE, value = "true")} +) +public class SubqueryInSelectClauseJpaComplianceTest extends AbstractSubqueryInSelectClauseTest { - em.createQuery( query ).getResultList(); - } ); + @Test + public void testSubqueryInSelectClause(EntityManagerFactoryScope scope) { + assertThrows( + IllegalStateException.class, + () -> + scope.inTransaction( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery query = cb.createTupleQuery(); + Root document = query.from( Document.class ); + Join contacts = document.join( "contacts", JoinType.LEFT ); + + Subquery personCount = query.subquery( Long.class ); + Root person = personCount.from( Person.class ); + personCount.select( cb.count( person ) ) + .where( cb.equal( contacts.get( "id" ), person.get( "id" ) ) ); + + query.multiselect( document.get( "id" ), personCount.getSelection() ); + + entityManager.createQuery( query ).getResultList(); + } ) + ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/SubqueryInSelectClauseTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/SubqueryInSelectClauseTest.java index e92fa9c1605d..a2039c4e8892 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/SubqueryInSelectClauseTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/SubqueryInSelectClauseTest.java @@ -4,9 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria.subquery; -import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; -import static org.junit.Assert.assertEquals; - import java.util.List; import jakarta.persistence.Tuple; @@ -17,16 +14,23 @@ import jakarta.persistence.criteria.Root; import jakarta.persistence.criteria.Subquery; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.JiraKey; -import org.junit.Test; +import org.hibernate.testing.orm.junit.Jpa; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; @JiraKey(value = "HHH-13111") +@Jpa( + annotatedClasses = {AbstractSubqueryInSelectClauseTest.Person.class, AbstractSubqueryInSelectClauseTest.Document.class} +) public class SubqueryInSelectClauseTest extends AbstractSubqueryInSelectClauseTest { @Test - public void testSubqueryInSelectClause() { - doInJPA( this::entityManagerFactory, em -> { - CriteriaBuilder cb = em.getCriteriaBuilder(); + public void testSubqueryInSelectClause(EntityManagerFactoryScope scope) { + scope.inTransaction( entityManager -> { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery query = cb.createTupleQuery(); Root document = query.from( Document.class ); Join contacts = document.join( "contacts", JoinType.LEFT ); @@ -37,8 +41,8 @@ public void testSubqueryInSelectClause() { query.multiselect( document.get( "id" ), personCount.getSelection() ); - List l = em.createQuery( query ).getResultList(); - assertEquals( 2, l.size() ); + List l = entityManager.createQuery( query ).getResultList(); + Assertions.assertEquals( 2, l.size() ); } ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/UncorrelatedSubqueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/UncorrelatedSubqueryTest.java index 042b496da79b..e18dc8b02a57 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/UncorrelatedSubqueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/subquery/UncorrelatedSubqueryTest.java @@ -43,7 +43,7 @@ public class UncorrelatedSubqueryTest { @Test public void testGetCorrelatedParentIllegalStateException(EntityManagerFactoryScope scope) { - // test that attempting to call getCorrelatedParent on a uncorrelated query/subquery + // test that attempting to call getCorrelatedParent on an uncorrelated query/subquery // throws ISE CriteriaBuilder builder = scope.getEntityManagerFactory().getCriteriaBuilder(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/DateCompositeCustomTypeTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/DateCompositeCustomTypeTest.java index 1e0ce5896758..e4eaff4a8b45 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/DateCompositeCustomTypeTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/DateCompositeCustomTypeTest.java @@ -30,8 +30,8 @@ @Jpa( - annotatedClasses = DateCompositeCustomTypeTest.Payment.class - , properties = @Setting(name = AvailableSettings.CRITERIA_VALUE_HANDLING_MODE, value = "inline") + annotatedClasses = DateCompositeCustomTypeTest.Payment.class, + properties = @Setting(name = AvailableSettings.CRITERIA_VALUE_HANDLING_MODE, value = "inline") ) public class DateCompositeCustomTypeTest { @@ -60,7 +60,7 @@ public void testDateCompositeCustomType(EntityManagerFactoryScope scope) { @Entity @Table(name = "crit_basic_payment") - public class Payment { + public static class Payment { private Long id; private BigDecimal amount; diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/EntityGraphTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/EntityGraphTest.java index 0a83219bc71b..9575d14eaa9a 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/EntityGraphTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/EntityGraphTest.java @@ -36,13 +36,13 @@ EntityGraphTest.Bar.class, EntityGraphTest.Baz.class, EntityGraphTest.Foo.class - } - , properties = @Setting(name = AvailableSettings.CRITERIA_VALUE_HANDLING_MODE, value = "inline") + }, + properties = @Setting(name = AvailableSettings.CRITERIA_VALUE_HANDLING_MODE, value = "inline") ) public class EntityGraphTest { @Test - public void loadIsMemeberQueriedCollection(EntityManagerFactoryScope scope) { + public void loadIsMemberQueriedCollection(EntityManagerFactoryScope scope) { Integer id = scope.fromTransaction( entityManager -> { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/EqualityComparisonTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/EqualityComparisonTest.java index 3075a5f3277e..141ca5eeb3da 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/EqualityComparisonTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/EqualityComparisonTest.java @@ -4,23 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria.valuehandlingmode.inline; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.sql.Date; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -import org.hibernate.cfg.AvailableSettings; -import org.hibernate.metamodel.model.domain.JpaMetamodel; -import org.hibernate.query.sqm.tree.predicate.SqmComparisonPredicate; - -import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; -import org.hibernate.testing.orm.junit.Jpa; -import org.hibernate.testing.orm.junit.Setting; -import org.junit.Assert; -import org.junit.jupiter.api.Test; - import jakarta.persistence.AttributeOverride; import jakarta.persistence.AttributeOverrides; import jakarta.persistence.Basic; @@ -49,6 +32,22 @@ import jakarta.persistence.criteria.Root; import jakarta.persistence.metamodel.EntityType; +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.metamodel.model.domain.JpaMetamodel; +import org.hibernate.query.sqm.tree.predicate.SqmComparisonPredicate; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.Setting; + +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.sql.Date; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + import static org.junit.jupiter.api.Assertions.assertEquals; @Jpa( @@ -56,8 +55,8 @@ EqualityComparisonTest.Address.class, EqualityComparisonTest.Phone.class, EqualityComparisonTest.Product.class - } - , properties = @Setting(name = AvailableSettings.CRITERIA_VALUE_HANDLING_MODE, value = "inline") + }, + properties = @Setting(name = AvailableSettings.CRITERIA_VALUE_HANDLING_MODE, value = "inline") ) public class EqualityComparisonTest { @@ -124,7 +123,7 @@ public void testEqualityComparisonLiteralConversion(EntityManagerFactoryScope sc product.get( Product_.getSingularAttribute( "partNumber", Long.class ) ), 373767373 ); - Assert.assertEquals( Long.class, predicate.getLeftHandExpression().getJavaType() ); + assertEquals( Long.class, predicate.getLeftHandExpression().getJavaType() ); cquery.where( predicate ); entityManager.createQuery( cquery ).getResultList(); @@ -132,7 +131,7 @@ public void testEqualityComparisonLiteralConversion(EntityManagerFactoryScope sc cb.length( product.get( Product_.getSingularAttribute( "name", String.class ) ) ), 4L ); - Assert.assertEquals( Integer.class, predicate.getLeftHandExpression().getJavaType() ); + assertEquals( Integer.class, predicate.getLeftHandExpression().getJavaType() ); cquery.where( predicate ); entityManager.createQuery( cquery ).getResultList(); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/ExpressionsTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/ExpressionsTest.java index f4974ba94d2c..0bde8737184d 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/ExpressionsTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/ExpressionsTest.java @@ -4,17 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria.valuehandlingmode.inline; -import java.util.Collections; -import java.util.List; -import java.util.Set; - -import org.hibernate.cfg.AvailableSettings; - -import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; -import org.hibernate.testing.orm.junit.Jpa; -import org.hibernate.testing.orm.junit.Setting; -import org.junit.jupiter.api.Test; - import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.ElementCollection; @@ -29,12 +18,23 @@ import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.Setting; + +import org.junit.jupiter.api.Test; + +import java.util.Collections; +import java.util.List; +import java.util.Set; + @Jpa( annotatedClasses = { ExpressionsTest.Address.class, ExpressionsTest.Phone.class - } - , properties = @Setting(name = AvailableSettings.CRITERIA_VALUE_HANDLING_MODE, value = "inline") + }, + properties = @Setting(name = AvailableSettings.CRITERIA_VALUE_HANDLING_MODE, value = "inline") ) public class ExpressionsTest { @@ -137,7 +137,7 @@ public static class Address implements java.io.Serializable { private String city; private String state; private String zip; - private List phones = new java.util.ArrayList(); + private List phones = new java.util.ArrayList<>(); public Address() { } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/MapJoinTestWithEmbeddable.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/MapJoinWithEmbeddableTest.java similarity index 87% rename from hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/MapJoinTestWithEmbeddable.java rename to hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/MapJoinWithEmbeddableTest.java index ddeb23a0decb..5e7d7688a2c8 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/MapJoinTestWithEmbeddable.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/MapJoinWithEmbeddableTest.java @@ -4,19 +4,6 @@ */ package org.hibernate.orm.test.jpa.criteria.valuehandlingmode.inline; -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - - -import org.hibernate.cfg.AvailableSettings; - -import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; -import org.hibernate.testing.orm.junit.Jpa; -import org.hibernate.testing.orm.junit.Setting; - -import org.junit.jupiter.api.Test; - import jakarta.persistence.CollectionTable; import jakarta.persistence.Column; import jakarta.persistence.ElementCollection; @@ -35,19 +22,30 @@ import jakarta.persistence.criteria.MapJoin; import jakarta.persistence.criteria.Root; +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; +import org.hibernate.testing.orm.junit.Jpa; +import org.hibernate.testing.orm.junit.Setting; + +import org.junit.jupiter.api.Test; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + /** * @author Christian Beikov */ @Jpa( annotatedClasses = { - MapJoinTestWithEmbeddable.Batch.class, - MapJoinTestWithEmbeddable.Node.class, - MapJoinTestWithEmbeddable.BatchNodeMetadata.class - } - ,properties = @Setting( name = AvailableSettings.CRITERIA_VALUE_HANDLING_MODE, value = "inline") + MapJoinWithEmbeddableTest.Batch.class, + MapJoinWithEmbeddableTest.Node.class, + MapJoinWithEmbeddableTest.BatchNodeMetadata.class + }, + properties = @Setting( name = AvailableSettings.CRITERIA_VALUE_HANDLING_MODE, value = "inline") ) -public class MapJoinTestWithEmbeddable { +public class MapJoinWithEmbeddableTest { @Test public void testSelectingKeyOfMapJoin(EntityManagerFactoryScope scope) { @@ -113,14 +111,14 @@ public static class BatchNodeMetadata implements Serializable { @Column(nullable = false) @Enumerated(EnumType.STRING) - private NodeMigration migrering = NodeMigration.TOTAL; + private NodeMigration migration = NodeMigration.TOTAL; - public NodeMigration getMigrering() { - return migrering; + public NodeMigration getMigration() { + return migration; } - public void setMigrering(NodeMigration migrering) { - this.migrering = migrering; + public void setMigration(NodeMigration migration) { + this.migration = migration; } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/NonPkAssociationEqualityPredicateParameterTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/NonPkAssociationEqualityPredicateParameterTest.java index 7e32c6ea6b55..8beecd063556 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/NonPkAssociationEqualityPredicateParameterTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/NonPkAssociationEqualityPredicateParameterTest.java @@ -23,7 +23,7 @@ import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; @Jpa( annotatedClasses = { @@ -50,7 +50,7 @@ public void testEqualityCheck(EntityManagerFactoryScope scope) { ); List orders = entityManager.createQuery( orderCriteria ).getResultList(); - assertTrue( orders.size() == 0 ); + assertEquals( 0, orders.size() ); } ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/NonPkAssociationEqualityPredicateTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/NonPkAssociationEqualityPredicateTest.java index 3f807b89d73b..4be9a82903e8 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/NonPkAssociationEqualityPredicateTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/NonPkAssociationEqualityPredicateTest.java @@ -23,7 +23,7 @@ import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; @Jpa( annotatedClasses = { @@ -50,7 +50,7 @@ public void testEqualityCheck(EntityManagerFactoryScope scope) { ); List orders = entityManager.createQuery( orderCriteria ).getResultList(); - assertTrue( orders.size() == 0 ); + assertEquals( 0, orders.size() ); } ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/PredicateTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/PredicateTest.java index 033a12b56a93..1ab56bad99df 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/PredicateTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/PredicateTest.java @@ -27,7 +27,7 @@ import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; @Jpa( annotatedClasses = { @@ -59,7 +59,7 @@ public void testQuotientConversion(EntityManagerFactoryScope scope) { orderCriteria.where( p ); List orders = entityManager.createQuery( orderCriteria ).getResultList(); - assertTrue( orders.size() == 0 ); + assertEquals( 0, orders.size() ); } ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/SubQueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/SubQueryTest.java index ba094060108e..1d63b89ada71 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/SubQueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/criteria/valuehandlingmode/inline/SubQueryTest.java @@ -33,7 +33,7 @@ import jakarta.persistence.metamodel.EntityType; import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; @Jpa( annotatedClasses = {