|
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