Skip to content

Commit e55c05f

Browse files
committed
HHH-16954 introduce HibernateCriteriaBuilder.parameterList()
Signed-off-by: Gavin King <[email protected]>
1 parent 7ea607a commit e55c05f

File tree

5 files changed

+59
-9
lines changed

5 files changed

+59
-9
lines changed

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.hibernate.query.SortDirection;
2626
import org.hibernate.query.sqm.FrameKind;
2727
import org.hibernate.query.sqm.TemporalUnit;
28-
import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
2928

3029
import jakarta.persistence.Tuple;
3130
import jakarta.persistence.criteria.AbstractQuery;
@@ -640,6 +639,25 @@ default <T> JpaSubQuery<T> except(Subquery<? extends T> query1, Subquery<?>... q
640639
@Override
641640
<T> JpaParameterExpression<T> parameter(Class<T> paramClass, String name);
642641

642+
/**
643+
* Create a multivalued parameter accepting multiple arguments
644+
* packaged together as a {@link List}.
645+
* @param paramClass the type of each argument to the parameter
646+
* @param <T> the type of each argument to the parameter
647+
* @since 7.0
648+
*/
649+
<T> JpaParameterExpression<List<T>> parameterList(Class<T> paramClass);
650+
651+
/**
652+
* Create a multivalued parameter accepting multiple arguments
653+
* packaged together as a {@link List}.
654+
* @param paramClass the type of each argument to the parameter
655+
* @param name the parameter name
656+
* @param <T> the type of each argument to the parameter
657+
* @since 7.0
658+
*/
659+
<T> JpaParameterExpression<List<T>> parameterList(Class<T> paramClass, String name);
660+
643661
@Override
644662
JpaExpression<String> concat(Expression<String> x, Expression<String> y);
645663

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,16 @@ public JpaExpression<String> concat(Expression<String> x, Expression<String> y)
679679
return criteriaBuilder.concat( x, y );
680680
}
681681

682+
@Override
683+
public <T> JpaParameterExpression<List<T>> parameterList(Class<T> paramClass) {
684+
return criteriaBuilder.parameterList( paramClass );
685+
}
686+
687+
@Override
688+
public <T> JpaParameterExpression<List<T>> parameterList(Class<T> paramClass, String name) {
689+
return criteriaBuilder.parameterList( paramClass, name );
690+
}
691+
682692
@Override
683693
public JpaExpression<String> concat(Expression<String> x, String y) {
684694
return criteriaBuilder.concat( x, y );

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import org.hibernate.query.criteria.JpaExpression;
6464
import org.hibernate.query.criteria.JpaFunction;
6565
import org.hibernate.query.criteria.JpaOrder;
66+
import org.hibernate.query.criteria.JpaParameterExpression;
6667
import org.hibernate.query.criteria.JpaPredicate;
6768
import org.hibernate.query.criteria.JpaSearchOrder;
6869
import org.hibernate.query.criteria.JpaSelection;
@@ -1644,6 +1645,17 @@ public <T> JpaCriteriaParameter<T> parameter(Class<T> paramClass, String name) {
16441645
return new JpaCriteriaParameter<>( name, parameterType, notBasic, this );
16451646
}
16461647

1648+
@Override
1649+
public <T> JpaParameterExpression<List<T>> parameterList(Class<T> paramClass) {
1650+
return parameterList( paramClass, null );
1651+
}
1652+
1653+
@Override
1654+
public <T> JpaParameterExpression<List<T>> parameterList(Class<T> paramClass, String name) {
1655+
final BindableType<List<T>> parameterType = new MultiValueParameterType<>( (Class<List<T>>) (Class) List.class );
1656+
return new JpaCriteriaParameter<>( name, parameterType, true, this );
1657+
}
1658+
16471659
@Override
16481660
public SqmExpression<String> concat(List<Expression<String>> expressions) {
16491661
//noinspection unchecked

hibernate-core/src/test/java/org/hibernate/orm/test/query/CteTests.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,27 +24,21 @@
2424
import org.hibernate.sql.ast.tree.cte.CteMaterialization;
2525
import org.hibernate.sql.ast.tree.cte.CteSearchClauseKind;
2626

27-
import org.hibernate.testing.orm.domain.gambit.BasicEntity;
2827
import org.hibernate.testing.orm.junit.Jira;
2928
import org.hibernate.testing.orm.junit.SkipForDialect;
3029
import org.hibernate.testing.orm.domain.StandardDomainModel;
3130
import org.hibernate.testing.orm.domain.contacts.Address;
3231
import org.hibernate.testing.orm.domain.contacts.Contact;
3332
import org.hibernate.testing.orm.junit.DialectFeatureChecks;
3433
import org.hibernate.testing.orm.junit.DomainModel;
35-
import org.hibernate.testing.orm.junit.Jira;
3634
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
3735
import org.hibernate.testing.orm.junit.SessionFactory;
3836
import org.hibernate.testing.orm.junit.SessionFactoryScope;
39-
import org.hibernate.testing.orm.junit.SkipForDialect;
4037
import org.junit.jupiter.api.AfterEach;
4138
import org.junit.jupiter.api.BeforeEach;
4239
import org.junit.jupiter.api.Test;
4340

4441
import jakarta.persistence.Tuple;
45-
import jakarta.persistence.criteria.CriteriaQuery;
46-
import jakarta.persistence.criteria.Root;
47-
import jakarta.persistence.criteria.Subquery;
4842

4943
import static org.assertj.core.api.Assertions.assertThat;
5044
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -510,8 +504,7 @@ public void testRecursiveSearchClause(SessionFactoryScope scope) {
510504
scope.inTransaction(
511505
session -> {
512506
final HibernateCriteriaBuilder cb = session.getCriteriaBuilder();
513-
//noinspection unchecked
514-
final JpaParameterExpression<List<Integer>> param = cb.parameter( (Class<List<Integer>>) (Class<?>) List.class );
507+
final JpaParameterExpression<List<Integer>> param = cb.parameterList( Integer.class );
515508
final JpaCriteriaQuery<Tuple> cq = cb.createTupleQuery();
516509

517510
final JpaCriteriaQuery<Tuple> baseQuery = cb.createTupleQuery();

hibernate-core/src/test/java/org/hibernate/orm/test/query/criteria/CriteriaBuilderNonStandardFunctionsTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.Date;
1717
import java.util.List;
1818

19+
import jakarta.persistence.criteria.ParameterExpression;
1920
import org.hibernate.dialect.CockroachDialect;
2021
import org.hibernate.community.dialect.DerbyDialect;
2122
import org.hibernate.dialect.PostgreSQLDialect;
@@ -514,4 +515,20 @@ public void testDateTruncFunction(SessionFactoryScope scope) {
514515
assertEquals( eob.getTheLocalDateTime().truncatedTo( ChronoUnit.SECONDS ), result.get( 6 ) );
515516
} );
516517
}
518+
519+
@Test
520+
@JiraKey("HHH-16954")
521+
public void testParameterList(SessionFactoryScope scope) {
522+
scope.inTransaction( session -> {
523+
HibernateCriteriaBuilder cb = session.getCriteriaBuilder();
524+
CriteriaQuery<Tuple> query = cb.createTupleQuery();
525+
Root<EntityOfBasics> from = query.from(EntityOfBasics.class);
526+
ParameterExpression<List<Integer>> ids = cb.parameterList(Integer.class);
527+
query.where( from.get("id").in(ids));
528+
assertEquals(3,
529+
session.createQuery( query )
530+
.setParameter(ids, List.of(2, 3, 5))
531+
.getResultCount());
532+
} );
533+
}
517534
}

0 commit comments

Comments
 (0)