From 688cfc98686692c51e428830c2b78bba33d4000d Mon Sep 17 00:00:00 2001 From: Andrea Boriero Date: Sun, 11 Sep 2022 09:27:25 +0200 Subject: [PATCH 1/2] HHH-15497 Add test for issue --- .../SingleTableInheritancePersistTest.java | 44 +++++++++++++++---- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/inheritance/discriminator/SingleTableInheritancePersistTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/inheritance/discriminator/SingleTableInheritancePersistTest.java index 789789c84401..b1c876244454 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/inheritance/discriminator/SingleTableInheritancePersistTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/inheritance/discriminator/SingleTableInheritancePersistTest.java @@ -9,6 +9,18 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; + +import org.hibernate.query.spi.QueryImplementor; + +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.orm.junit.DomainModel; +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.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import jakarta.persistence.CascadeType; import jakarta.persistence.DiscriminatorColumn; import jakarta.persistence.DiscriminatorType; @@ -21,13 +33,6 @@ import jakarta.persistence.OneToMany; import jakarta.persistence.OneToOne; -import org.hibernate.testing.TestForIssue; -import org.hibernate.testing.orm.junit.DomainModel; -import org.hibernate.testing.orm.junit.SessionFactory; -import org.hibernate.testing.orm.junit.SessionFactoryScope; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.junit.jupiter.api.Assertions.fail; @@ -56,7 +61,7 @@ public class SingleTableInheritancePersistTest { private final List children = new ArrayList<>( Arrays.asList( susan, mark ) ); private final List familyMembers = Arrays.asList( john, jane, susan, mark ); - @BeforeEach + @BeforeAll public void setUp(SessionFactoryScope scope) { scope.inTransaction( session -> { @@ -77,7 +82,6 @@ public void setUp(SessionFactoryScope scope) { session.persist( family ); } ); - } @Test @@ -109,6 +113,28 @@ else if ( person instanceof Child ) { } ); } + @Test + @TestForIssue(jiraKey = "HHH-15497") + public void testFetchChildrenCountTwiceFails(SessionFactoryScope scope) { + scope.inTransaction( + session -> { + QueryImplementor query = session.createQuery( + "SELECT count(p) FROM Person p WHERE TYPE(p) = ?1", + Long.class + ); + query.setParameter( 1, Child.class ); + Long personCount = query.getSingleResult(); + + assertThat( personCount, is( 2L ) ); + + query = session.createQuery( "SELECT count(p) FROM Person p WHERE TYPE(p) = ?1", Long.class ); + query.setParameter( 1, Child.class ); + personCount = query.getSingleResult(); + + assertThat( personCount, is( 2L ) ); + } ); + } + @Entity(name = "Family") public static class Family { From 11047dc1b56d7b36a0193ad4d7ca9b97a3c54618 Mon Sep 17 00:00:00 2001 From: Andrea Boriero Date: Mon, 12 Sep 2022 17:05:57 +0200 Subject: [PATCH 2/2] HHH-15497 Count query when counting polymorphic subclasses by type fails when run twice --- .../hibernate/query/internal/QueryParameterBindingImpl.java | 4 +--- .../main/java/org/hibernate/query/sqm/internal/SqmUtil.java | 5 +++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingImpl.java b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingImpl.java index 6e234266c67e..8aa53192d833 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingImpl.java @@ -51,9 +51,7 @@ public class QueryParameterBindingImpl implements QueryParameterBinding, J protected QueryParameterBindingImpl( QueryParameter queryParameter, SessionFactoryImplementor sessionFactory) { - this.queryParameter = queryParameter; - this.sessionFactory = sessionFactory; - this.bindType = queryParameter.getHibernateType(); + this( queryParameter, sessionFactory, queryParameter.getHibernateType() ); } /** diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmUtil.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmUtil.java index f0fdd924fa75..fa647608a273 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmUtil.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmUtil.java @@ -204,6 +204,11 @@ public static JdbcParameterBindings createJdbcParameterBindings( final Map, List>> jdbcParamMap = jdbcParamXref.get( queryParam ); for ( SqmParameter sqmParameter : sqmParameters ) { + final MappingModelExpressible resolvedMappingModelType = mappingModelResolutionAccess + .getResolvedMappingModelType( sqmParameter ); + if ( resolvedMappingModelType != null ) { + domainParamBinding.setType( resolvedMappingModelType ); + } final Bindable parameterType = determineParameterType( domainParamBinding, queryParam,