Skip to content

Commit b571b22

Browse files
committed
HHH-17724 add count(*) to HibernateCriteriaBuilder
and remove some unused type parameters
1 parent ecd0acb commit b571b22

File tree

5 files changed

+41
-13
lines changed

5 files changed

+41
-13
lines changed

hibernate-core/src/main/java/org/hibernate/query/criteria/HibernateCriteriaBuilder.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,11 @@ default <T> JpaSubQuery<T> except(Subquery<? extends T> query1, Subquery<?>... q
389389
@Override
390390
JpaExpression<Long> countDistinct(Expression<?> x);
391391

392+
/**
393+
* Equivalent to HQL {@code count(*)}.
394+
*/
395+
JpaExpression<Long> count();
396+
392397
@Override
393398
<N extends Number> JpaExpression<N> neg(Expression<N> x);
394399

@@ -2680,15 +2685,15 @@ <T> JpaExpression<T[]> arrayAgg(
26802685
* @since 6.4
26812686
*/
26822687
@Incubating
2683-
<T> JpaExpression<String> arrayToString(Expression<? extends Object[]> arrayExpression, Expression<String> separatorExpression);
2688+
JpaExpression<String> arrayToString(Expression<? extends Object[]> arrayExpression, Expression<String> separatorExpression);
26842689

26852690
/**
26862691
* Concatenates the non-null array elements with a separator, as specified by the arguments.
26872692
*
26882693
* @since 6.4
26892694
*/
26902695
@Incubating
2691-
<T> JpaExpression<String> arrayToString(Expression<? extends Object[]> arrayExpression, String separator);
2696+
JpaExpression<String> arrayToString(Expression<? extends Object[]> arrayExpression, String separator);
26922697

26932698
/**
26942699
* Whether an array contains an element.

hibernate-core/src/main/java/org/hibernate/query/criteria/spi/HibernateCriteriaBuilderDelegate.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,11 @@ public JpaExpression<Long> count(Expression<?> argument) {
439439
return criteriaBuilder.count( argument );
440440
}
441441

442+
@Override
443+
public JpaExpression<Long> count() {
444+
return criteriaBuilder.count();
445+
}
446+
442447
@Override
443448
public JpaExpression<Long> countDistinct(Expression<?> x) {
444449
return criteriaBuilder.countDistinct( x );
@@ -2435,15 +2440,15 @@ public <T> JpaExpression<T[]> arrayFill(T element, Integer elementCount) {
24352440

24362441
@Override
24372442
@Incubating
2438-
public <T> JpaExpression<String> arrayToString(
2443+
public JpaExpression<String> arrayToString(
24392444
Expression<? extends Object[]> arrayExpression,
24402445
Expression<String> separatorExpression) {
24412446
return criteriaBuilder.arrayToString( arrayExpression, separatorExpression );
24422447
}
24432448

24442449
@Override
24452450
@Incubating
2446-
public <T> JpaExpression<String> arrayToString(Expression<? extends Object[]> arrayExpression, String separator) {
2451+
public JpaExpression<String> arrayToString(Expression<? extends Object[]> arrayExpression, String separator) {
24472452
return criteriaBuilder.arrayToString( arrayExpression, separator );
24482453
}
24492454

hibernate-core/src/main/java/org/hibernate/query/sqm/NodeBuilder.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import java.util.Map;
1818
import java.util.Set;
1919

20-
import org.hibernate.Incubating;
2120
import org.hibernate.engine.spi.SessionFactoryImplementor;
2221
import org.hibernate.metamodel.model.domain.JpaMetamodel;
2322
import org.hibernate.query.NullPrecedence;
@@ -32,7 +31,6 @@
3231
import org.hibernate.query.criteria.JpaSearchedCase;
3332
import org.hibernate.query.criteria.JpaSelection;
3433
import org.hibernate.query.criteria.JpaSimpleCase;
35-
import org.hibernate.query.criteria.JpaValues;
3634
import org.hibernate.query.criteria.JpaWindow;
3735
import org.hibernate.query.spi.QueryEngine;
3836
import org.hibernate.query.sqm.tree.delete.SqmDeleteStatement;
@@ -240,10 +238,10 @@ <T> SqmExpression<T[]> arrayAgg(
240238
<T> SqmExpression<T[]> arrayFill(T element, Integer elementCount);
241239

242240
@Override
243-
<T> SqmExpression<String> arrayToString(Expression<? extends Object[]> arrayExpression, Expression<String> separatorExpression);
241+
SqmExpression<String> arrayToString(Expression<? extends Object[]> arrayExpression, Expression<String> separatorExpression);
244242

245243
@Override
246-
<T> SqmExpression<String> arrayToString(Expression<? extends Object[]> arrayExpression, String separator);
244+
SqmExpression<String> arrayToString(Expression<? extends Object[]> arrayExpression, String separator);
247245

248246
@Override
249247
<T> SqmPredicate arrayContains(Expression<T[]> arrayExpression, Expression<T> elementExpression);
@@ -596,6 +594,9 @@ <T> SqmExpression<T[]> arrayAgg(
596594
@Override
597595
SqmExpression<Long> countDistinct(Expression<?> x);
598596

597+
@Override
598+
SqmExpression<Long> count();
599+
599600
@Override
600601
<N extends Number> SqmExpression<N> neg(Expression<N> x);
601602

hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java

+12-5
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import org.hibernate.metamodel.model.domain.BasicDomainType;
4545
import org.hibernate.metamodel.model.domain.DomainType;
4646
import org.hibernate.metamodel.model.domain.JpaMetamodel;
47-
import org.hibernate.metamodel.model.domain.SimpleDomainType;
4847
import org.hibernate.metamodel.model.domain.SingularPersistentAttribute;
4948
import org.hibernate.metamodel.model.domain.internal.BasicTypeImpl;
5049
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
@@ -77,7 +76,6 @@
7776
import org.hibernate.query.sqm.SetOperator;
7877
import org.hibernate.query.sqm.SqmExpressible;
7978
import org.hibernate.query.sqm.SqmPathSource;
80-
import org.hibernate.query.sqm.SqmQuerySource;
8179
import org.hibernate.query.sqm.TemporalUnit;
8280
import org.hibernate.query.sqm.TrimSpec;
8381
import org.hibernate.query.sqm.UnaryArithmeticOperator;
@@ -121,6 +119,7 @@
121119
import org.hibernate.query.sqm.tree.expression.SqmLiteralNull;
122120
import org.hibernate.query.sqm.tree.expression.SqmModifiedSubQueryExpression;
123121
import org.hibernate.query.sqm.tree.expression.SqmOver;
122+
import org.hibernate.query.sqm.tree.expression.SqmStar;
124123
import org.hibernate.query.sqm.tree.expression.SqmToDuration;
125124
import org.hibernate.query.sqm.tree.expression.SqmTrimSpecification;
126125
import org.hibernate.query.sqm.tree.expression.SqmTuple;
@@ -182,7 +181,6 @@
182181
import static java.util.Arrays.asList;
183182
import static org.hibernate.query.internal.QueryHelper.highestPrecedenceType;
184183
import static org.hibernate.query.sqm.TrimSpec.fromCriteriaTrimSpec;
185-
import static org.hibernate.query.sqm.internal.TypecheckUtil.assertComparable;
186184

187185
/**
188186
* Acts as a JPA {@link jakarta.persistence.criteria.CriteriaBuilder} by
@@ -855,6 +853,15 @@ public SqmExpression<Long> countDistinct(Expression<?> argument) {
855853
);
856854
}
857855

856+
@Override
857+
public SqmExpression<Long> count() {
858+
return getFunctionDescriptor( "count" ).generateSqmExpression(
859+
new SqmStar( this ),
860+
null,
861+
queryEngine
862+
);
863+
}
864+
858865
@Override
859866
public JpaExpression<Integer> sign(Expression<? extends Number> x) {
860867
return getFunctionDescriptor( "sign" ).generateSqmExpression(
@@ -4280,7 +4287,7 @@ public <T> SqmExpression<T[]> arrayFill(T element, Integer elementCount) {
42804287
}
42814288

42824289
@Override
4283-
public <T> SqmExpression<String> arrayToString(
4290+
public SqmExpression<String> arrayToString(
42844291
Expression<? extends Object[]> arrayExpression,
42854292
Expression<String> separatorExpression) {
42864293
return getFunctionDescriptor( "array_to_string" ).generateSqmExpression(
@@ -4291,7 +4298,7 @@ public <T> SqmExpression<String> arrayToString(
42914298
}
42924299

42934300
@Override
4294-
public <T> SqmExpression<String> arrayToString(
4301+
public SqmExpression<String> arrayToString(
42954302
Expression<? extends Object[]> arrayExpression,
42964303
String separator) {
42974304
return getFunctionDescriptor( "array_to_string" ).generateSqmExpression(

hibernate-core/src/test/java/org/hibernate/orm/test/jpa/CountEntityWithCompositeIdTest.java

+10
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import jakarta.persistence.criteria.CriteriaQuery;
1111
import jakarta.persistence.criteria.Root;
1212

13+
import org.hibernate.query.criteria.HibernateCriteriaBuilder;
1314
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
1415
import org.hibernate.testing.orm.junit.Jpa;
1516
import org.junit.jupiter.api.Test;
@@ -34,5 +35,14 @@ public void shouldCount(EntityManagerFactoryScope scope) {
3435
assertThat(entityManager.createQuery(cq).getSingleResult().intValue(), is(0));
3536
}
3637
);
38+
scope.inTransaction(
39+
entityManager -> {
40+
HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder();
41+
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
42+
cq.from(EntityWithCompositeId.class);
43+
cq.select(cb.count());
44+
assertThat(entityManager.createQuery(cq).getSingleResult().intValue(), is(0));
45+
}
46+
);
3747
}
3848
}

0 commit comments

Comments
 (0)