Skip to content

Commit f5edcd9

Browse files
committed
HHH-19364 make Specification subtypes produce TypedQueryReferences
1 parent acb7ef5 commit f5edcd9

File tree

7 files changed

+32
-12
lines changed

7 files changed

+32
-12
lines changed

hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@
7373
import org.hibernate.query.hql.spi.SqmQueryImplementor;
7474
import org.hibernate.query.named.NamedObjectRepository;
7575
import org.hibernate.query.named.NamedResultSetMappingMemento;
76-
import org.hibernate.query.programmatic.MutationSpecification;
77-
import org.hibernate.query.programmatic.SelectionSpecification;
76+
import org.hibernate.query.specification.internal.MutationSpecificationImpl;
77+
import org.hibernate.query.specification.internal.SelectionSpecificationImpl;
7878
import org.hibernate.query.spi.HqlInterpretation;
7979
import org.hibernate.query.spi.QueryImplementor;
8080
import org.hibernate.query.sql.internal.NativeQueryImpl;
@@ -905,11 +905,11 @@ public <T> QueryImplementor<T> createQuery(String queryString, Class<T> expected
905905
@Override
906906
public <R> QueryImplementor<R> createQuery(TypedQueryReference<R> typedQueryReference) {
907907
checksBeforeQueryCreation();
908-
if ( typedQueryReference instanceof SelectionSpecification<R> specification ) {
908+
if ( typedQueryReference instanceof SelectionSpecificationImpl<R> specification ) {
909909
final CriteriaQuery<R> query = specification.buildCriteria( getCriteriaBuilder() );
910910
return new QuerySqmImpl<>( (SqmStatement<R>) query, specification.getResultType(), this );
911911
}
912-
else if ( typedQueryReference instanceof MutationSpecification<?> specification ) {
912+
else if ( typedQueryReference instanceof MutationSpecificationImpl<?> specification ) {
913913
final CommonAbstractCriteria query = specification.buildCriteria( getCriteriaBuilder() );
914914
return new QuerySqmImpl<>( (SqmStatement<R>) query, (Class<R>) specification.getResultType(), this );
915915
}

hibernate-core/src/main/java/org/hibernate/query/specification/MutationSpecification.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
* @since 7.0
4040
*/
4141
@Incubating
42-
public interface MutationSpecification<T> extends QuerySpecification<T>, TypedQueryReference<Void> {
42+
public interface MutationSpecification<T> extends QuerySpecification<T> {
4343

4444
/**
4545
* Covariant override.
@@ -82,7 +82,7 @@ interface Augmentation<T> {
8282
MutationSpecification<T> validate(CriteriaBuilder builder);
8383

8484
@Override
85-
Class<Void> getResultType();
85+
TypedQueryReference<Void> reference();
8686

8787
/**
8888
* Returns a specification reference which can be used to programmatically,

hibernate-core/src/main/java/org/hibernate/query/specification/QuerySpecification.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package org.hibernate.query.specification;
66

77
import jakarta.persistence.EntityManager;
8+
import jakarta.persistence.TypedQueryReference;
89
import jakarta.persistence.criteria.CriteriaBuilder;
910
import jakarta.persistence.criteria.CommonAbstractCriteria;
1011

@@ -87,4 +88,11 @@ public interface QuerySpecification<T> {
8788
* @throws Exception if it ain't all good
8889
*/
8990
QuerySpecification<T> validate(CriteriaBuilder builder);
91+
92+
/**
93+
* Obtain a {@linkplain TypedQueryReference reference}
94+
* to this specification which may be passed along to
95+
* {@link EntityManager#createQuery(TypedQueryReference)}.
96+
*/
97+
TypedQueryReference<?> reference();
9098
}

hibernate-core/src/main/java/org/hibernate/query/specification/SelectionSpecification.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
*/
55
package org.hibernate.query.specification;
66

7-
import jakarta.persistence.EntityManager;
87
import jakarta.persistence.TypedQueryReference;
8+
import jakarta.persistence.EntityManager;
99
import jakarta.persistence.criteria.CriteriaQuery;
1010
import jakarta.persistence.criteria.CriteriaBuilder;
1111
import jakarta.persistence.criteria.Root;
@@ -60,7 +60,7 @@
6060
* @since 7.0
6161
*/
6262
@Incubating
63-
public interface SelectionSpecification<T> extends QuerySpecification<T>, TypedQueryReference<T> {
63+
public interface SelectionSpecification<T> extends QuerySpecification<T> {
6464
/**
6565
* Adds an ordering to the selection specification.
6666
* Appended to any previous ordering.
@@ -187,7 +187,7 @@ interface Augmentation<T> {
187187
SelectionSpecification<T> validate(CriteriaBuilder builder);
188188

189189
@Override
190-
Class<T> getResultType();
190+
TypedQueryReference<T> reference();
191191

192192
/**
193193
* Returns a specification reference which can be used to programmatically,

hibernate-core/src/main/java/org/hibernate/query/specification/internal/MutationSpecificationImpl.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package org.hibernate.query.specification.internal;
66

77
import jakarta.persistence.EntityManager;
8+
import jakarta.persistence.TypedQueryReference;
89
import jakarta.persistence.criteria.CriteriaBuilder;
910
import jakarta.persistence.criteria.CriteriaDelete;
1011
import jakarta.persistence.criteria.CriteriaUpdate;
@@ -46,7 +47,7 @@
4647
*
4748
* @author Steve Ebersole
4849
*/
49-
public class MutationSpecificationImpl<T> implements MutationSpecification<T> {
50+
public class MutationSpecificationImpl<T> implements MutationSpecification<T>, TypedQueryReference<Void> {
5051

5152
private final List<BiConsumer<SqmDeleteOrUpdateStatement<T>, SqmRoot<T>>> specifications = new ArrayList<>();
5253
private final String hql;
@@ -86,6 +87,11 @@ public Map<String,Object> getHints() {
8687
return Collections.emptyMap();
8788
}
8889

90+
@Override
91+
public TypedQueryReference<Void> reference() {
92+
return this;
93+
}
94+
8995
@Override
9096
public MutationSpecification<T> restrict(Restriction<? super T> restriction) {
9197
specifications.add( (sqmStatement, mutationTargetRoot) -> {

hibernate-core/src/main/java/org/hibernate/query/specification/internal/SelectionSpecificationImpl.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package org.hibernate.query.specification.internal;
66

77
import jakarta.persistence.EntityManager;
8+
import jakarta.persistence.TypedQueryReference;
89
import jakarta.persistence.criteria.CriteriaQuery;
910
import jakarta.persistence.criteria.CriteriaBuilder;
1011

@@ -51,7 +52,7 @@
5152
*
5253
* @author Steve Ebersole
5354
*/
54-
public class SelectionSpecificationImpl<T> implements SelectionSpecification<T> {
55+
public class SelectionSpecificationImpl<T> implements SelectionSpecification<T>, TypedQueryReference<T> {
5556
private final Class<T> resultType;
5657
private final String hql;
5758
private final CriteriaQuery<T> criteriaQuery;
@@ -90,6 +91,11 @@ public Map<String,Object> getHints() {
9091
return Collections.emptyMap();
9192
}
9293

94+
@Override
95+
public TypedQueryReference<T> reference() {
96+
return this;
97+
}
98+
9399
@Override
94100
public SelectionSpecification<T> restrict(Restriction<? super T> restriction) {
95101
specifications.add( (sqmStatement, root) -> {

hibernate-core/src/test/java/org/hibernate/orm/test/query/dynamic/SimpleQuerySpecificationTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ void testUseAsTypedQueryRef(SessionFactoryScope factoryScope) {
306306
var spec = SelectionSpecification.create( BasicEntity.class )
307307
.restrict( Restriction.restrict( BasicEntity_.position, Range.closed( 1, 5 ) ) )
308308
.sort( Order.asc( BasicEntity_.position ) );
309-
session.createQuery(spec).getResultList();
309+
session.createQuery(spec.reference()).getResultList();
310310
} );
311311

312312
assertThat( sqlCollector.getSqlQueries() ).hasSize( 1 );

0 commit comments

Comments
 (0)