|
32 | 32 | import org.hibernate.query.sqm.tree.expression.SqmParameter;
|
33 | 33 | import org.hibernate.query.sqm.tree.select.SqmDynamicInstantiation;
|
34 | 34 | import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
|
| 35 | +import org.hibernate.query.sqm.tree.select.SqmSelectableNode; |
35 | 36 | import org.hibernate.query.sqm.tree.select.SqmSelection;
|
36 | 37 | import org.hibernate.sql.ast.SqlAstTranslator;
|
37 | 38 | import org.hibernate.sql.ast.tree.expression.Expression;
|
@@ -75,7 +76,7 @@ public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> {
|
75 | 76 | private final SqmSelectStatement<?> sqm;
|
76 | 77 | private final DomainParameterXref domainParameterXref;
|
77 | 78 | private final RowTransformer<R> rowTransformer;
|
78 |
| - private final SqmInterpreter<Object, ResultsConsumer<?, R>> executeQueryInterpreter; |
| 79 | + private final SqmInterpreter<?, ? extends ResultsConsumer<?, R>> executeQueryInterpreter; |
79 | 80 | private final SqmInterpreter<List<R>, Void> listInterpreter;
|
80 | 81 | private final SqmInterpreter<ScrollableResultsImplementor<R>, ScrollMode> scrollInterpreter;
|
81 | 82 |
|
@@ -356,33 +357,31 @@ else if ( isClass( resultType ) ) {
|
356 | 357 | private static <T> RowTransformer<T> makeRowTransformerTupleTransformerAdapter(
|
357 | 358 | SqmSelectStatement<?> sqm,
|
358 | 359 | QueryOptions queryOptions) {
|
| 360 | + @SuppressWarnings("unchecked") |
| 361 | + final TupleTransformer<T> tupleTransformer = (TupleTransformer<T>) queryOptions.getTupleTransformer(); |
| 362 | + return new RowTransformerTupleTransformerAdapter<>( adapterAliases( sqm ), tupleTransformer ); |
| 363 | + } |
| 364 | + |
| 365 | + private static String[] adapterAliases(SqmSelectStatement<?> sqm) { |
359 | 366 | final List<String> aliases = new ArrayList<>();
|
360 | 367 | for ( SqmSelection<?> sqmSelection : sqm.getQuerySpec().getSelectClause().getSelections() ) {
|
361 | 368 | // The row a tuple transformer gets to see only contains 1 element for a dynamic instantiation
|
362 |
| - if ( sqmSelection.getSelectableNode() instanceof SqmDynamicInstantiation<?> ) { |
| 369 | + final SqmSelectableNode<?> selectableNode = sqmSelection.getSelectableNode(); |
| 370 | + if ( selectableNode instanceof SqmDynamicInstantiation<?> ) { |
363 | 371 | aliases.add( sqmSelection.getAlias() );
|
364 | 372 | }
|
365 | 373 | else {
|
366 |
| - sqmSelection.getSelectableNode().visitSubSelectableNodes( |
367 |
| - subSelection -> aliases.add( subSelection.getAlias() ) |
368 |
| - ); |
| 374 | + selectableNode.visitSubSelectableNodes( subSelection -> aliases.add( subSelection.getAlias() ) ); |
369 | 375 | }
|
370 | 376 | }
|
371 |
| - |
372 |
| - |
373 |
| - @SuppressWarnings("unchecked") |
374 |
| - TupleTransformer<T> tupleTransformer = (TupleTransformer<T>) queryOptions.getTupleTransformer(); |
375 |
| - return new RowTransformerTupleTransformerAdapter<>( toStringArray( aliases ), tupleTransformer ); |
| 377 | + return toStringArray( aliases ); |
376 | 378 | }
|
377 | 379 |
|
378 | 380 | @Override
|
379 | 381 | public <T> T executeQuery(DomainQueryExecutionContext executionContext, ResultsConsumer<T, R> resultsConsumer) {
|
380 |
| - //noinspection unchecked,rawtypes |
381 |
| - return withCacheableSqmInterpretation( |
382 |
| - executionContext, |
383 |
| - resultsConsumer, |
384 |
| - (SqmInterpreter<T, ResultsConsumer<T, R>>) (SqmInterpreter) executeQueryInterpreter |
385 |
| - ); |
| 382 | + @SuppressWarnings("unchecked") //TODO: check the return type |
| 383 | + var interpreter = (SqmInterpreter<T, ResultsConsumer<T, R>>) executeQueryInterpreter; |
| 384 | + return withCacheableSqmInterpretation( executionContext, resultsConsumer, interpreter ); |
386 | 385 | }
|
387 | 386 |
|
388 | 387 | @Override
|
|
0 commit comments