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 050601c4a8652d8ce7522b30c95c63f7747e494e 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 --- .../query/internal/QueryParameterBindingImpl.java | 4 +--- .../query/sqm/sql/BaseSqmToSqlAstConverter.java | 10 +++++----- .../sqm/tree/expression/AbstractSqmExpression.java | 4 ++++ 3 files changed, 10 insertions(+), 8 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/sql/BaseSqmToSqlAstConverter.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java index 62dc58ea4fb4..ea560780b90b 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java @@ -181,6 +181,7 @@ import org.hibernate.query.sqm.tree.domain.SqmPluralValuedSimplePath; import org.hibernate.query.sqm.tree.domain.SqmTreatedPath; import org.hibernate.query.sqm.tree.domain.SqmTreatedRoot; +import org.hibernate.query.sqm.tree.expression.AbstractSqmExpression; import org.hibernate.query.sqm.tree.expression.Conversion; import org.hibernate.query.sqm.tree.expression.JpaCriteriaParameter; import org.hibernate.query.sqm.tree.expression.SqmAliasedNodeRef; @@ -4890,11 +4891,8 @@ protected Expression consumeSqmParameter( final QueryParameterImplementor queryParameter = domainParameterXref.getQueryParameter( sqmParameter ); final QueryParameterBinding binding = domainParameterBindings.getBinding( queryParameter ); if ( binding.setType( valueMapping ) ) { - replaceJdbcParametersType( - sqmParameter, - domainParameterXref.getSqmParameters( queryParameter ), - valueMapping - ); + // Align the SqmParameter expressible type with the binding type + ( (AbstractSqmExpression) sqmParameter ).forceInferableType( (SqmExpressible) binding.getBindType() ); } return new SqmParameterInterpretation( sqmParameter, @@ -6802,6 +6800,8 @@ private Predicate processInSingleParameter( if ( !iterator.hasNext() ) { domainParamBinding.setType( (MappingModelExpressible) determineValueMapping( sqmPredicate.getTestExpression(), fromClauseIndex ) ); + // Align the SqmParameter expressible type with the binding type + ( (AbstractSqmExpression) sqmParameter ).forceInferableType( (SqmExpressible) domainParamBinding.getBindType() ); return inListPredicate; } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/AbstractSqmExpression.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/AbstractSqmExpression.java index 3cb86cdf8fbd..df1e4866af52 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/AbstractSqmExpression.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/AbstractSqmExpression.java @@ -156,4 +156,8 @@ public JpaSelection alias(String name) { public JavaType getJavaTypeDescriptor() { return getNodeType() == null ? null : getNodeType().getExpressibleJavaType(); } + + public void forceInferableType(SqmExpressible type){ + setExpressibleType( type ); + } }