From b571b227771e4858afb8bc21a3547cd8fe8e8e04 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Thu, 8 Feb 2024 12:15:23 +0100 Subject: [PATCH] HHH-17724 add count(*) to HibernateCriteriaBuilder and remove some unused type parameters --- .../criteria/HibernateCriteriaBuilder.java | 9 +++++++-- .../spi/HibernateCriteriaBuilderDelegate.java | 9 +++++++-- .../org/hibernate/query/sqm/NodeBuilder.java | 9 +++++---- .../sqm/internal/SqmCriteriaNodeBuilder.java | 17 ++++++++++++----- .../jpa/CountEntityWithCompositeIdTest.java | 10 ++++++++++ 5 files changed, 41 insertions(+), 13 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/HibernateCriteriaBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/HibernateCriteriaBuilder.java index 860a0afc9b..f0c4773548 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/HibernateCriteriaBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/HibernateCriteriaBuilder.java @@ -389,6 +389,11 @@ default JpaSubQuery except(Subquery query1, Subquery... q @Override JpaExpression countDistinct(Expression x); + /** + * Equivalent to HQL {@code count(*)}. + */ + JpaExpression count(); + @Override JpaExpression neg(Expression x); @@ -2680,7 +2685,7 @@ JpaExpression arrayAgg( * @since 6.4 */ @Incubating - JpaExpression arrayToString(Expression arrayExpression, Expression separatorExpression); + JpaExpression arrayToString(Expression arrayExpression, Expression separatorExpression); /** * Concatenates the non-null array elements with a separator, as specified by the arguments. @@ -2688,7 +2693,7 @@ JpaExpression arrayAgg( * @since 6.4 */ @Incubating - JpaExpression arrayToString(Expression arrayExpression, String separator); + JpaExpression arrayToString(Expression arrayExpression, String separator); /** * Whether an array contains an element. diff --git a/hibernate-core/src/main/java/org/hibernate/query/criteria/spi/HibernateCriteriaBuilderDelegate.java b/hibernate-core/src/main/java/org/hibernate/query/criteria/spi/HibernateCriteriaBuilderDelegate.java index fc22ac6b9a..10f6ee4751 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/criteria/spi/HibernateCriteriaBuilderDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/query/criteria/spi/HibernateCriteriaBuilderDelegate.java @@ -439,6 +439,11 @@ public JpaExpression count(Expression argument) { return criteriaBuilder.count( argument ); } + @Override + public JpaExpression count() { + return criteriaBuilder.count(); + } + @Override public JpaExpression countDistinct(Expression x) { return criteriaBuilder.countDistinct( x ); @@ -2435,7 +2440,7 @@ public JpaExpression arrayFill(T element, Integer elementCount) { @Override @Incubating - public JpaExpression arrayToString( + public JpaExpression arrayToString( Expression arrayExpression, Expression separatorExpression) { return criteriaBuilder.arrayToString( arrayExpression, separatorExpression ); @@ -2443,7 +2448,7 @@ public JpaExpression arrayToString( @Override @Incubating - public JpaExpression arrayToString(Expression arrayExpression, String separator) { + public JpaExpression arrayToString(Expression arrayExpression, String separator) { return criteriaBuilder.arrayToString( arrayExpression, separator ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/NodeBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/NodeBuilder.java index fa6dfd80af..cb15774343 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/NodeBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/NodeBuilder.java @@ -17,7 +17,6 @@ import java.util.Map; import java.util.Set; -import org.hibernate.Incubating; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.model.domain.JpaMetamodel; import org.hibernate.query.NullPrecedence; @@ -32,7 +31,6 @@ import org.hibernate.query.criteria.JpaSearchedCase; import org.hibernate.query.criteria.JpaSelection; import org.hibernate.query.criteria.JpaSimpleCase; -import org.hibernate.query.criteria.JpaValues; import org.hibernate.query.criteria.JpaWindow; import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.sqm.tree.delete.SqmDeleteStatement; @@ -240,10 +238,10 @@ SqmExpression arrayAgg( SqmExpression arrayFill(T element, Integer elementCount); @Override - SqmExpression arrayToString(Expression arrayExpression, Expression separatorExpression); + SqmExpression arrayToString(Expression arrayExpression, Expression separatorExpression); @Override - SqmExpression arrayToString(Expression arrayExpression, String separator); + SqmExpression arrayToString(Expression arrayExpression, String separator); @Override SqmPredicate arrayContains(Expression arrayExpression, Expression elementExpression); @@ -596,6 +594,9 @@ SqmExpression arrayAgg( @Override SqmExpression countDistinct(Expression x); + @Override + SqmExpression count(); + @Override SqmExpression neg(Expression x); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java index d3c9a9b9c2..69a398bfde 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java @@ -44,7 +44,6 @@ import org.hibernate.metamodel.model.domain.BasicDomainType; import org.hibernate.metamodel.model.domain.DomainType; import org.hibernate.metamodel.model.domain.JpaMetamodel; -import org.hibernate.metamodel.model.domain.SimpleDomainType; import org.hibernate.metamodel.model.domain.SingularPersistentAttribute; import org.hibernate.metamodel.model.domain.internal.BasicTypeImpl; import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor; @@ -77,7 +76,6 @@ import org.hibernate.query.sqm.SetOperator; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.SqmPathSource; -import org.hibernate.query.sqm.SqmQuerySource; import org.hibernate.query.sqm.TemporalUnit; import org.hibernate.query.sqm.TrimSpec; import org.hibernate.query.sqm.UnaryArithmeticOperator; @@ -121,6 +119,7 @@ import org.hibernate.query.sqm.tree.expression.SqmLiteralNull; import org.hibernate.query.sqm.tree.expression.SqmModifiedSubQueryExpression; import org.hibernate.query.sqm.tree.expression.SqmOver; +import org.hibernate.query.sqm.tree.expression.SqmStar; import org.hibernate.query.sqm.tree.expression.SqmToDuration; import org.hibernate.query.sqm.tree.expression.SqmTrimSpecification; import org.hibernate.query.sqm.tree.expression.SqmTuple; @@ -182,7 +181,6 @@ import static java.util.Arrays.asList; import static org.hibernate.query.internal.QueryHelper.highestPrecedenceType; import static org.hibernate.query.sqm.TrimSpec.fromCriteriaTrimSpec; -import static org.hibernate.query.sqm.internal.TypecheckUtil.assertComparable; /** * Acts as a JPA {@link jakarta.persistence.criteria.CriteriaBuilder} by @@ -855,6 +853,15 @@ public SqmExpression countDistinct(Expression argument) { ); } + @Override + public SqmExpression count() { + return getFunctionDescriptor( "count" ).generateSqmExpression( + new SqmStar( this ), + null, + queryEngine + ); + } + @Override public JpaExpression sign(Expression x) { return getFunctionDescriptor( "sign" ).generateSqmExpression( @@ -4280,7 +4287,7 @@ public SqmExpression arrayFill(T element, Integer elementCount) { } @Override - public SqmExpression arrayToString( + public SqmExpression arrayToString( Expression arrayExpression, Expression separatorExpression) { return getFunctionDescriptor( "array_to_string" ).generateSqmExpression( @@ -4291,7 +4298,7 @@ public SqmExpression arrayToString( } @Override - public SqmExpression arrayToString( + public SqmExpression arrayToString( Expression arrayExpression, String separator) { return getFunctionDescriptor( "array_to_string" ).generateSqmExpression( diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/CountEntityWithCompositeIdTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/CountEntityWithCompositeIdTest.java index b4f5e3dfe7..9ddb51c394 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/CountEntityWithCompositeIdTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/CountEntityWithCompositeIdTest.java @@ -10,6 +10,7 @@ import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; +import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; import org.hibernate.testing.orm.junit.Jpa; import org.junit.jupiter.api.Test; @@ -34,5 +35,14 @@ public void shouldCount(EntityManagerFactoryScope scope) { assertThat(entityManager.createQuery(cq).getSingleResult().intValue(), is(0)); } ); + scope.inTransaction( + entityManager -> { + HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Long.class); + cq.from(EntityWithCompositeId.class); + cq.select(cb.count()); + assertThat(entityManager.createQuery(cq).getSingleResult().intValue(), is(0)); + } + ); } }