@@ -195,18 +195,18 @@ protected static SqmJdbcExecutionContextAdapter listInterpreterExecutionContext(
195
195
return new MySqmJdbcExecutionContextAdapter ( executionContext , jdbcSelect , subSelectFetchKeyHandler , hql );
196
196
}
197
197
198
- private static Class <?> singleSelectionType (SqmSelectStatement <?> sqm ) {
198
+ private static SqmSelection <?> singleSelection (SqmSelectStatement <?> sqm ) {
199
199
final List <SqmSelection <?>> selections = sqm .getQueryPart ()
200
200
.getFirstQuerySpec ()
201
201
.getSelectClause ()
202
202
.getSelections ();
203
- if ( selections .size () == 1 ) {
204
- final SqmSelection <?> sqmSelection = selections . get ( 0 );
205
- return sqmSelection . getSelectableNode (). isCompoundSelection () ?
206
- null :
207
- sqmSelection . getNodeJavaType ().getJavaTypeClass ();
208
- }
209
- return null ;
203
+ return selections .size () == 1 ? selections . get ( 0 ) : null ;
204
+ }
205
+
206
+ private static Class <?> selectionType ( SqmSelection <?> selection ) {
207
+ return selection != null && ! selection . getSelectableNode ().isCompoundSelection () ?
208
+ selection . getNodeJavaType (). getJavaTypeClass ()
209
+ : null ;
210
210
}
211
211
212
212
@ SuppressWarnings ("unchecked" )
@@ -221,37 +221,40 @@ protected static <T> RowTransformer<T> determineRowTransformer(
221
221
else if ( resultType == null ) {
222
222
return RowTransformerStandardImpl .instance ();
223
223
}
224
- else if ( resultType == Object [].class ) {
225
- return (RowTransformer <T >) RowTransformerArrayImpl .instance ();
226
- }
227
- else if ( resultType == List .class && resultType != singleSelectionType ( sqm ) ) {
228
- return (RowTransformer <T >) RowTransformerListImpl .instance ();
229
- }
230
224
else {
231
- // NOTE : if we get here :
232
- // 1) there is no TupleTransformer specified
233
- // 2) an explicit result-type, other than an array or List, was specified
234
-
235
- if ( tupleMetadata == null ) {
236
- if ( sqm .getQueryPart ().getFirstQuerySpec ().getSelectClause ().getSelections ().size () == 1 ) {
237
- return RowTransformerSingularReturnImpl .instance ();
238
- }
239
- else {
240
- throw new AssertionFailure ( "Query defined multiple selections, should have had TupleMetadata" );
241
- }
225
+ final SqmSelection <?> selection = singleSelection ( sqm );
226
+ if ( resultType .isArray () && resultType != selectionType ( selection ) ) {
227
+ return (RowTransformer <T >) RowTransformerArrayImpl .instance ();
228
+ }
229
+ else if ( resultType == List .class && resultType != selectionType ( selection ) ) {
230
+ return (RowTransformer <T >) RowTransformerListImpl .instance ();
242
231
}
243
232
else {
244
- if ( Tuple .class .equals ( resultType ) ) {
245
- return (RowTransformer <T >) new RowTransformerJpaTupleImpl ( tupleMetadata );
246
- }
247
- else if ( Map .class .equals ( resultType ) ) {
248
- return (RowTransformer <T >) new RowTransformerMapImpl ( tupleMetadata );
249
- }
250
- else if ( isClass ( resultType ) ) {
251
- return new RowTransformerConstructorImpl <>( resultType , tupleMetadata );
233
+ // NOTE : if we get here :
234
+ // 1) there is no TupleTransformer specified
235
+ // 2) an explicit result-type, other than an array or List, was specified
236
+
237
+ if ( tupleMetadata == null ) {
238
+ if ( selection != null ) {
239
+ return RowTransformerSingularReturnImpl .instance ();
240
+ }
241
+ else {
242
+ throw new AssertionFailure ( "Query defined multiple selections, should have had TupleMetadata" );
243
+ }
252
244
}
253
245
else {
254
- throw new InstantiationException ( "Query result type is not instantiable" , resultType );
246
+ if ( Tuple .class .equals ( resultType ) ) {
247
+ return (RowTransformer <T >) new RowTransformerJpaTupleImpl ( tupleMetadata );
248
+ }
249
+ else if ( Map .class .equals ( resultType ) ) {
250
+ return (RowTransformer <T >) new RowTransformerMapImpl ( tupleMetadata );
251
+ }
252
+ else if ( isClass ( resultType ) ) {
253
+ return new RowTransformerConstructorImpl <>( resultType , tupleMetadata );
254
+ }
255
+ else {
256
+ throw new InstantiationException ( "Query result type is not instantiable" , resultType );
257
+ }
255
258
}
256
259
}
257
260
}
0 commit comments