Skip to content

Commit e9769ec

Browse files
committed
promote getTupleTransformer() and getResultListTransformer() to SelectionQuery
some refactoring in Query hierarchy
1 parent 65cf39b commit e9769ec

File tree

11 files changed

+297
-195
lines changed

11 files changed

+297
-195
lines changed

hibernate-core/src/main/java/org/hibernate/query/SelectionQuery.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,16 @@ default Stream<R> stream() {
647647
*/
648648
SelectionQuery<R> setFollowOnLocking(boolean enable);
649649

650+
/**
651+
* Set a {@link TupleTransformer}.
652+
*/
653+
<T> SelectionQuery<T> setTupleTransformer(TupleTransformer<T> transformer);
654+
655+
/**
656+
* Set a {@link ResultListTransformer}.
657+
*/
658+
SelectionQuery<R> setResultListTransformer(ResultListTransformer<R> transformer);
659+
650660
@Override
651661
SelectionQuery<R> setParameter(String name, Object value);
652662

hibernate-core/src/main/java/org/hibernate/query/spi/AbstractQuery.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030
import org.hibernate.LockOptions;
3131
import org.hibernate.engine.spi.SharedSessionContractImplementor;
3232
import org.hibernate.graph.GraphSemantic;
33-
import org.hibernate.internal.CoreLogging;
34-
import org.hibernate.internal.CoreMessageLogger;
3533
import org.hibernate.jpa.AvailableHints;
3634
import org.hibernate.jpa.internal.util.LockModeTypeHelper;
3735
import org.hibernate.query.BindableType;
@@ -73,7 +71,6 @@
7371
public abstract class AbstractQuery<R>
7472
extends AbstractSelectionQuery<R>
7573
implements QueryImplementor<R> {
76-
protected static final CoreMessageLogger log = CoreLogging.messageLogger( AbstractQuery.class );
7774

7875
public AbstractQuery(SharedSessionContractImplementor session) {
7976
super( session );

hibernate-core/src/main/java/org/hibernate/query/spi/SimpleHqlInterpretationImpl.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
import java.util.concurrent.ConcurrentHashMap;
88

99
import org.hibernate.query.sqm.internal.DomainParameterXref;
10-
import org.hibernate.query.sqm.internal.SqmUtil;
1110
import org.hibernate.query.sqm.tree.SqmStatement;
1211
import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
1312

13+
import static org.hibernate.query.sqm.internal.SqmUtil.checkQueryReturnType;
14+
import static org.hibernate.query.sqm.internal.SqmUtil.isResultTypeAlwaysAllowed;
15+
1416
/**
1517
* @author Steve Ebersole
1618
*/
@@ -48,9 +50,9 @@ public DomainParameterXref getDomainParameterXref() {
4850
@Override
4951
public void validateResultType(Class<?> resultType) {
5052
assert sqmStatement instanceof SqmSelectStatement<?>;
51-
if ( resultType != null && !SqmUtil.isResultTypeAlwaysAllowed( resultType ) ) {
53+
if ( resultType != null && !isResultTypeAlwaysAllowed( resultType ) ) {
5254
if ( !allowedReturnTypes.containsKey( resultType ) ) {
53-
SqmUtil.checkQueryReturnType( ( (SqmSelectStatement<R>) sqmStatement ).getQueryPart(), resultType );
55+
checkQueryReturnType( ( (SqmSelectStatement<R>) sqmStatement ).getQueryPart(), resultType );
5456
allowedReturnTypes.put( resultType, Boolean.TRUE );
5557
}
5658
}

hibernate-core/src/main/java/org/hibernate/query/sql/internal/NativeQueryImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import org.checkerframework.checker.nullness.qual.Nullable;
2222
import org.hibernate.CacheMode;
2323
import org.hibernate.FlushMode;
24+
import org.hibernate.internal.CoreLogging;
25+
import org.hibernate.internal.CoreMessageLogger;
2426
import org.hibernate.jpa.spi.NativeQueryConstructorTransformer;
2527
import org.hibernate.jpa.spi.NativeQueryListTransformer;
2628
import org.hibernate.jpa.spi.NativeQueryMapTransformer;
@@ -137,6 +139,9 @@
137139
public class NativeQueryImpl<R>
138140
extends AbstractQuery<R>
139141
implements NativeQueryImplementor<R>, DomainQueryExecutionContext, ResultSetMappingResolutionContext {
142+
143+
private static final CoreMessageLogger log = CoreLogging.messageLogger( NativeQueryImpl.class );
144+
140145
private final String sqlString;
141146
private final String originalSqlString;
142147
private final ParameterMetadataImplementor parameterMetadata;

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
import org.hibernate.query.QueryFlushMode;
1616
import org.hibernate.query.BindableType;
1717
import org.hibernate.query.QueryParameter;
18+
import org.hibernate.query.ResultListTransformer;
1819
import org.hibernate.query.SelectionQuery;
20+
import org.hibernate.query.TupleTransformer;
1921
import org.hibernate.query.spi.SqmQuery;
2022

2123
import jakarta.persistence.Parameter;
@@ -163,4 +165,10 @@ public interface SqmSelectionQuery<R> extends SqmQuery, SelectionQuery<R> {
163165

164166
@Override
165167
SqmSelectionQuery<R> setReadOnly(boolean readOnly);
168+
169+
@Override
170+
<T> SqmSelectionQuery<T> setTupleTransformer(TupleTransformer<T> transformer);
171+
172+
@Override
173+
SqmSelectionQuery<R> setResultListTransformer(ResultListTransformer<R> transformer);
166174
}

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

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818
import org.hibernate.query.criteria.JpaSelection;
1919
import org.hibernate.query.hql.internal.NamedHqlQueryMementoImpl;
2020
import org.hibernate.query.hql.internal.QuerySplitter;
21-
import org.hibernate.query.named.NamedQueryMemento;
2221
import org.hibernate.query.spi.AbstractSelectionQuery;
2322
import org.hibernate.query.spi.HqlInterpretation;
2423
import org.hibernate.query.spi.MutableQueryOptions;
24+
import org.hibernate.query.spi.ParameterMetadataImplementor;
2525
import org.hibernate.query.spi.QueryEngine;
2626
import org.hibernate.query.spi.QueryOptions;
2727
import org.hibernate.query.spi.SelectQueryPlan;
@@ -35,11 +35,9 @@
3535
import org.hibernate.query.sqm.tree.select.SqmSelectableNode;
3636
import org.hibernate.query.sqm.tree.select.SqmSelection;
3737
import org.hibernate.sql.results.internal.TupleMetadata;
38-
import org.hibernate.type.BasicType;
3938
import org.hibernate.type.BasicTypeRegistry;
4039

4140
import java.util.List;
42-
import java.util.Map;
4341

4442
import jakarta.persistence.TupleElement;
4543
import jakarta.persistence.criteria.CompoundSelection;
@@ -113,8 +111,7 @@ protected void errorOrLogForPaginationWithCollectionFetch() {
113111
public abstract TupleMetadata getTupleMetadata();
114112

115113
private SqmSelectStatement<R> getSqmSelectStatement() {
116-
final SqmStatement<R> sqmStatement = getSqmStatement();
117-
if ( sqmStatement instanceof SqmSelectStatement<R> selectStatement ) {
114+
if ( getSqmStatement() instanceof SqmSelectStatement<R> selectStatement ) {
118115
return selectStatement;
119116
}
120117
else {
@@ -172,10 +169,10 @@ public KeyedResultList<R> getKeyedResultList(KeyedPage<R> keyedPage) {
172169
final List<KeyedResult<R>> results =
173170
new SqmSelectionQueryImpl<KeyedResult<R>>( this, keyedPage )
174171
.getResultList();
175-
final Page page = keyedPage.getPage();
172+
int pageSize = keyedPage.getPage().getSize();
176173
return new KeyedResultList<>(
177-
collectResults( results, page.getSize(), keyedPage.getKeyInterpretation() ),
178-
collectKeys( results, page.getSize() ),
174+
collectResults( results, pageSize, keyedPage.getKeyInterpretation() ),
175+
collectKeys( results, pageSize ),
179176
keyedPage,
180177
nextPage( keyedPage, results ),
181178
previousPage( keyedPage, results )
@@ -256,8 +253,8 @@ protected <T> ConcreteSqmSelectQueryPlan<T> buildConcreteQueryPlan(
256253
);
257254
}
258255

259-
protected void applyOptions(NamedSqmQueryMemento<?> memento) {
260-
applyOptions( (NamedQueryMemento<?>) memento );
256+
protected void applySqmOptions(NamedSqmQueryMemento<?> memento) {
257+
applyOptions( memento );
261258

262259
if ( memento.getFirstResult() != null ) {
263260
setFirstResult( memento.getFirstResult() );
@@ -270,12 +267,10 @@ protected void applyOptions(NamedSqmQueryMemento<?> memento) {
270267
if ( memento.getParameterTypes() != null ) {
271268
final BasicTypeRegistry basicTypeRegistry =
272269
getSessionFactory().getTypeConfiguration().getBasicTypeRegistry();
273-
for ( Map.Entry<String, String> entry : memento.getParameterTypes().entrySet() ) {
274-
final BasicType<?> type =
275-
basicTypeRegistry.getRegisteredType( entry.getValue() );
276-
getParameterMetadata()
277-
.getQueryParameter( entry.getKey() ).applyAnticipatedType( type );
278-
}
270+
final ParameterMetadataImplementor parameterMetadata = getParameterMetadata();
271+
memento.getParameterTypes().forEach( (key, value) ->
272+
parameterMetadata.getQueryParameter( key )
273+
.applyAnticipatedType( basicTypeRegistry.getRegisteredType( value ) ) );
279274
}
280275
}
281276

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public QuerySqmImpl(
144144
expectedResultType,
145145
session
146146
);
147-
applyOptions( memento );
147+
applySqmOptions( memento );
148148
}
149149

150150
public QuerySqmImpl(
@@ -153,7 +153,7 @@ public QuerySqmImpl(
153153
SharedSessionContractImplementor session) {
154154
this( (SqmStatement<R>) memento.getSqmStatement(), resultType, session );
155155

156-
applyOptions( memento );
156+
applySqmOptions( memento );
157157
}
158158

159159
/**

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

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import org.hibernate.query.Order;
3535
import org.hibernate.query.Page;
3636
import org.hibernate.query.QueryParameter;
37+
import org.hibernate.query.ResultListTransformer;
38+
import org.hibernate.query.TupleTransformer;
3739
import org.hibernate.query.criteria.internal.NamedCriteriaQueryMementoImpl;
3840
import org.hibernate.query.hql.internal.NamedHqlQueryMementoImpl;
3941
import org.hibernate.query.internal.DelegatingDomainQueryExecutionContext;
@@ -132,7 +134,7 @@ public SqmSelectionQueryImpl(
132134
session
133135
);
134136

135-
applyOptions( memento );
137+
applySqmOptions( memento );
136138
}
137139

138140
public SqmSelectionQueryImpl(
@@ -141,7 +143,7 @@ public SqmSelectionQueryImpl(
141143
SharedSessionContractImplementor session) {
142144
//noinspection unchecked
143145
this( (SqmSelectStatement<R>) memento.getSqmStatement(), expectedResultType, session );
144-
applyOptions( memento );
146+
applySqmOptions( memento );
145147
}
146148

147149
public SqmSelectionQueryImpl(
@@ -169,8 +171,8 @@ public SqmSelectionQueryImpl(
169171

170172
// Parameters might be created through HibernateCriteriaBuilder.value which we need to bind here
171173
for ( SqmParameter<?> sqmParameter : domainParameterXref.getParameterResolutions().getSqmParameters() ) {
172-
if ( sqmParameter instanceof SqmJpaCriteriaParameterWrapper<?> ) {
173-
bindCriteriaParameter( (SqmJpaCriteriaParameterWrapper<?>) sqmParameter );
174+
if ( sqmParameter instanceof SqmJpaCriteriaParameterWrapper<?> wrapper ) {
175+
bindCriteriaParameter( wrapper );
174176
}
175177
}
176178

@@ -195,15 +197,17 @@ <E> SqmSelectionQueryImpl(AbstractSqmSelectionQuery<?> original, KeyedPage<E> ke
195197
final List<Order<? super E>> keyDefinition = keyedPage.getKeyDefinition();
196198
final List<Order<? super E>> appliedKeyDefinition =
197199
keyedPage.getKeyInterpretation() == KEY_OF_FIRST_ON_NEXT_PAGE
198-
? Order.reverse( keyDefinition ) : keyDefinition;
200+
? Order.reverse( keyDefinition )
201+
: keyDefinition;
199202

200203
//noinspection unchecked
201204
sqm = (SqmSelectStatement<R>) paginate(
202205
appliedKeyDefinition,
203206
key,
204207
// Change the query source to CRITERIA, because we will change the query and introduce parameters
205-
(SqmSelectStatement<KeyedResult<E>>) original.getSqmStatement()
206-
.copy( noParamCopyContext( SqmQuerySource.CRITERIA ) ),
208+
(SqmSelectStatement<KeyedResult<E>>)
209+
original.getSqmStatement()
210+
.copy( noParamCopyContext( SqmQuerySource.CRITERIA ) ),
207211
original.getSqmStatement().nodeBuilder()
208212
);
209213
hql = CRITERIA_HQL_STRING;
@@ -241,11 +245,8 @@ private <T> void setBindValues(QueryParameter<?> parameter, QueryParameterBindin
241245
final TemporalType explicitTemporalPrecision = binding.getExplicitTemporalPrecision();
242246
if ( explicitTemporalPrecision != null ) {
243247
if ( binding.isMultiValued() ) {
244-
parameterBinding.setBindValues(
245-
binding.getBindValues(),
246-
explicitTemporalPrecision,
247-
getSessionFactory().getTypeConfiguration()
248-
);
248+
parameterBinding.setBindValues( binding.getBindValues(), explicitTemporalPrecision,
249+
getSessionFactory().getTypeConfiguration() );
249250
}
250251
else {
251252
parameterBinding.setBindValue( binding.getBindValue(), explicitTemporalPrecision );
@@ -343,6 +344,19 @@ public String getQueryString() {
343344
return hql;
344345
}
345346

347+
@Override
348+
public <T> SqmSelectionQuery<T> setTupleTransformer(TupleTransformer<T> transformer) {
349+
getQueryOptions().setTupleTransformer( transformer );
350+
//noinspection unchecked
351+
return (SqmSelectionQuery<T>) this;
352+
}
353+
354+
@Override
355+
public SqmSelectionQuery<R> setResultListTransformer(ResultListTransformer<R> transformer) {
356+
getQueryOptions().setResultListTransformer( transformer );
357+
return this;
358+
}
359+
346360
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
347361
// execution
348362

0 commit comments

Comments
 (0)