diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/SqmCacheable.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/SqmCacheable.java index a1ebe8479897..719cbecd187a 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/SqmCacheable.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/SqmCacheable.java @@ -20,7 +20,7 @@ public interface SqmCacheable { int cacheHashCode(); static boolean areCompatible(@Nullable SqmCacheable e1, @Nullable SqmCacheable e2) { - return e1 == null ? e2 == null : e1.isCompatible( e2 ); + return e1 == null ? e2 == null : e2 != null && e1.isCompatible( e2 ); } static boolean areCompatible(@Nullable Collection collection1, @Nullable Collection collection2) { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/criteria/internal/expression/SearchedCaseExpressionTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/criteria/internal/expression/SearchedCaseExpressionTest.java index 85927a2ba638..201a78979b4b 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/criteria/internal/expression/SearchedCaseExpressionTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/criteria/internal/expression/SearchedCaseExpressionTest.java @@ -4,7 +4,6 @@ */ package org.hibernate.orm.test.query.criteria.internal.expression; -import java.util.List; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; @@ -15,73 +14,85 @@ import jakarta.persistence.criteria.Expression; import jakarta.persistence.criteria.Path; import jakarta.persistence.criteria.Root; - - +import org.hibernate.testing.orm.junit.DomainModel; import org.hibernate.testing.orm.junit.JiraKey; -import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; -import org.junit.Assert; -import org.junit.Test; +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.hibernate.testing.transaction.TransactionUtil.doInHibernate; -import static org.junit.Assert.assertEquals; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; /** * * @author Vasyl Danyliuk */ -public class SearchedCaseExpressionTest extends BaseCoreFunctionalTestCase { +@DomainModel( + annotatedClasses = { + SearchedCaseExpressionTest.Event.class, + SearchedCaseExpressionTest.EventType.class + } +) +@SessionFactory +public class SearchedCaseExpressionTest { + + @AfterEach + public void tearDown(SessionFactoryScope scope) { + scope.getSessionFactory().getSchemaManager().truncateMappedObjects(); + } @Test - public void testCaseClause() { - doInHibernate( this::sessionFactory, session -> { + public void testCaseClause(SessionFactoryScope scope) { + scope.inTransaction( session -> { CriteriaBuilder cb = session.getCriteriaBuilder(); - CriteriaQuery criteria = cb.createQuery(Event.class); + CriteriaQuery criteria = cb.createQuery( Event.class ); - Root event = criteria.from(Event.class); - Path type = event.get("type"); + Root event = criteria.from( Event.class ); + Path type = event.get( "type" ); - Expression caseWhen = cb.selectCase(type) - .when(EventType.TYPE1, "Admin Event") - .when(EventType.TYPE2, "User Event") - .when(EventType.TYPE3, "Reporter Event") - .otherwise(""); + Expression caseWhen = cb.selectCase( type ) + .when( EventType.TYPE1, "Admin Event" ) + .when( EventType.TYPE2, "User Event" ) + .when( EventType.TYPE3, "Reporter Event" ) + .otherwise( "" ); - criteria.select(event); - criteria.where(cb.equal(caseWhen, "Admin Event")); // OK when use cb.like() method and others - List resultList = session.createQuery(criteria).getResultList(); + criteria.select( event ); + criteria.where( cb.equal( caseWhen, "Admin Event" ) ); // OK when use cb.like() method and others + List resultList = session.createQuery( criteria ).getResultList(); - Assert.assertNotNull(resultList); + assertThat( resultList ).isNotNull(); } ); } @Test - public void testEqualClause() { - doInHibernate( this::sessionFactory, session -> { + public void testEqualClause(SessionFactoryScope scope) { + scope.inTransaction( session -> { CriteriaBuilder cb = session.getCriteriaBuilder(); - CriteriaQuery criteria = cb.createQuery(Event.class); + CriteriaQuery criteria = cb.createQuery( Event.class ); - Root event = criteria.from(Event.class); - Path type = event.get("type"); + Root event = criteria.from( Event.class ); + Path type = event.get( "type" ); Expression caseWhen = cb.selectCase() - .when(cb.equal(type, EventType.TYPE1), "Type1") - .otherwise(""); - - criteria.select(event); - criteria.where(cb.equal(caseWhen, "Admin Event")); // OK when use cb.like() method and others - List resultList = session.createQuery(criteria).getResultList(); + .when( cb.equal( type, EventType.TYPE1 ), "Type1" ) + .otherwise( "" ); + criteria.select( event ); + criteria.where( cb.equal( caseWhen, "Admin Event" ) ); // OK when use cb.like() method and others + List resultList = session.createQuery( criteria ).getResultList(); - Assert.assertNotNull(resultList); + assertThat( resultList ).isNotNull(); } ); } @Test @JiraKey(value = "HHH-13167") - public void testMissingElseClause() { - doInHibernate( this::sessionFactory, session -> { + public void testMissingElseClause(SessionFactoryScope scope) { + scope.inTransaction( session -> { Event event = new Event(); event.id = 1L; event.type = EventType.TYPE1; @@ -89,7 +100,7 @@ public void testMissingElseClause() { session.persist( event ); } ); - doInHibernate( this::sessionFactory, session -> { + scope.inTransaction( session -> { CriteriaBuilder cb = session.getCriteriaBuilder(); CriteriaQuery criteria = cb.createQuery( Event.class ); @@ -97,25 +108,66 @@ public void testMissingElseClause() { Root root = criteria.from( Event.class ); Path type = root.get( "type" ); - Expression caseWhen = cb. selectCase() + Expression caseWhen = cb.selectCase() .when( cb.equal( type, EventType.TYPE1 ), "Matched" ); criteria.select( root ); criteria.where( cb.equal( caseWhen, "Matched" ) ); Event event = session.createQuery( criteria ).getSingleResult(); - assertEquals( 1L, (long) event.id ); + assertThat( event.id ).isEqualTo( 1L ); } ); } - @Override - protected boolean isCleanupTestDataRequired() { - return true; - } - @Override - protected Class[] getAnnotatedClasses() { - return new Class[]{ Event.class, EventType.class }; + @Test + @JiraKey( "HHH-19896" ) + public void testCaseWhenWithOtherwiseClauseExecutedAfterOneWithout(SessionFactoryScope scope) { + scope.inTransaction( session -> { + Event event = new Event(); + event.id = 1L; + event.type = EventType.TYPE1; + + session.persist( event ); + } ); + + scope.inTransaction( session -> { + CriteriaBuilder cb = session.getCriteriaBuilder(); + + CriteriaQuery criteria = cb.createQuery( Event.class ); + + Root root = criteria.from( Event.class ); + Path type = root.get( "type" ); + + Expression caseWhen = cb.selectCase() + .when( cb.equal( type, EventType.TYPE1 ), "Matched" ); + + criteria.select( root ); + criteria.where( cb.equal( caseWhen, "Matched" ) ); + + Event event = session.createQuery( criteria ).getSingleResult(); + assertThat( event.id ).isEqualTo( 1L ); + } ); + + scope.inTransaction( session -> { + CriteriaBuilder cb = session.getCriteriaBuilder(); + + CriteriaQuery criteria = cb.createQuery( Event.class ); + + Root event = criteria.from( Event.class ); + Path type = event.get( "type" ); + + Expression caseWhen = cb.selectCase() + .when( cb.equal( type, EventType.TYPE1 ), "Type1" ) + .otherwise( "" ); + + criteria.select( event ); + criteria.where( cb.equal( caseWhen, "Admin Event" ) ); // OK when use cb.like() method and others + List resultList = session.createQuery( criteria ).getResultList(); + + assertThat( resultList ).isNotNull(); + assertThat( resultList ).hasSize( 0 ); + } ); } @Entity(name = "Event") @@ -142,8 +194,6 @@ public Event type(EventType type) { } public enum EventType { - TYPE1, TYPE2, TYPE3 - } }