Skip to content

Commit fb0bca5

Browse files
committed
some cleanup to SQM selection handling
1 parent ccc451e commit fb0bca5

File tree

3 files changed

+44
-53
lines changed

3 files changed

+44
-53
lines changed

hibernate-core/src/main/java/org/hibernate/query/sqm/tree/select/SqmSelectClause.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -108,24 +108,18 @@ public void setSelection(SqmSelectableNode<?> selectableNode) {
108108

109109
public JpaSelection<?> resolveJpaSelection() {
110110
// NOTE : JPA's `Selection` contract is really better named `Selectable`
111-
if ( selections == null || selections.size() != 1 ) {
112-
return this;
113-
}
114-
else {
115-
return selections.get( 0 ).getSelectableNode();
116-
}
111+
return selections != null && selections.size() == 1 ? selections.get( 0 ).getSelectableNode() : this;
117112
}
118113

119114
@Override
120115
public List<SqmSelectableNode<?>> getSelectionItems() {
121116
final List<SqmSelectableNode<?>> subSelections = new ArrayList<>();
122-
123-
if ( this.selections != null ) {
124-
if ( this.selections.size() == 1 ) {
125-
this.selections.get( 0 ).getSelectableNode().visitSubSelectableNodes( subSelections::add );
117+
if ( selections != null ) {
118+
if ( selections.size() == 1 ) {
119+
selections.get( 0 ).getSelectableNode().visitSubSelectableNodes( subSelections::add );
126120
}
127121
else {
128-
for ( SqmSelection<?> selection : this.selections ) {
122+
for ( SqmSelection<?> selection : selections ) {
129123
selection.getSelectableNode().visitSubSelectableNodes( subSelections::add );
130124
}
131125
}

hibernate-core/src/main/java/org/hibernate/query/sqm/tree/select/SqmSelectStatement.java

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,7 @@ public SqmQuerySource getQuerySource() {
180180
@Override
181181
public SqmQuerySpec<T> getQuerySpec() {
182182
if ( querySource == CRITERIA ) {
183-
final SqmQueryPart<T> queryPart = getQueryPart();
184-
if ( queryPart instanceof SqmQuerySpec<T> querySpec ) {
183+
if ( getQueryPart() instanceof SqmQuerySpec<T> querySpec ) {
185184
return querySpec;
186185
}
187186
throw new IllegalStateException(
@@ -355,9 +354,8 @@ public SqmSelectStatement<T> multiselect(Selection<?>... selections) {
355354
checkSelectionIsJpaCompliant( selection );
356355
}
357356
}
358-
359-
final Selection<? extends T> resultSelection = getResultSelection( selections );
360-
getQuerySpec().getSelectClause().setSelection( (SqmSelectableNode<?>) resultSelection );
357+
getQuerySpec().getSelectClause()
358+
.setSelection( (SqmSelectableNode<?>) getResultSelection( selections ) );
361359
return this;
362360
}
363361

@@ -368,32 +366,29 @@ public SqmSelectStatement<T> multiselect(List<Selection<?>> selectionList) {
368366
checkSelectionIsJpaCompliant( selection );
369367
}
370368
}
371-
final Selection<? extends T> resultSelection = getResultSelection( selectionList );
372-
getQuerySpec().getSelectClause().setSelection( (SqmSelectableNode<?>) resultSelection );
369+
getQuerySpec().getSelectClause()
370+
.setSelection( (SqmSelectableNode<?>) getResultSelection( selectionList ) );
373371
return this;
374372
}
375373

376-
@SuppressWarnings("unchecked")
377-
private Selection<? extends T> getResultSelection(List<?> selections) {
374+
private JpaSelection<?> getResultSelection(List<Selection<?>> selections) {
378375
final Class<T> resultType = getResultType();
379376
if ( resultType == null || resultType == Object.class ) {
380-
switch ( selections.size() ) {
381-
case 0:
382-
throw new IllegalArgumentException( "Empty selections passed to criteria query typed as Object" );
383-
case 1:
384-
return (Selection<? extends T>) selections.get( 0 );
385-
default:
386-
return (Selection<? extends T>) nodeBuilder().array( (List<Selection<?>>) selections );
387-
}
377+
return switch ( selections.size() ) {
378+
case 0 -> throw new IllegalArgumentException(
379+
"empty selections passed to criteria query typed as Object" );
380+
case 1 -> (JpaSelection<?>) selections.get( 0 );
381+
default -> nodeBuilder().array( selections );
382+
};
388383
}
389384
else if ( Tuple.class.isAssignableFrom( resultType ) ) {
390-
return (Selection<? extends T>) nodeBuilder().tuple( (List<Selection<?>>) selections );
385+
return nodeBuilder().tuple( selections );
391386
}
392387
else if ( resultType.isArray() ) {
393-
return nodeBuilder().array( resultType, (List<? extends JpaSelection<?>>) selections );
388+
return nodeBuilder().array( resultType, selections );
394389
}
395390
else {
396-
return nodeBuilder().construct( resultType, (List<? extends JpaSelection<?>>) selections );
391+
return nodeBuilder().construct( resultType, selections );
397392
}
398393
}
399394

@@ -566,10 +561,12 @@ private <S> void aliasSelections(SqmQueryPart<S> queryPart) {
566561
final SqmQuerySpec<S> querySpec = queryPart.getFirstQuerySpec();
567562
final LinkedHashSet<JpaSelection<?>> newSelections = new LinkedHashSet<>();
568563
aliasSelection( querySpec.getSelection(), newSelections );
564+
final JpaSelection<?> selection =
565+
newSelections.size() == 1
566+
? newSelections.iterator().next()
567+
: nodeBuilder().tuple( newSelections.toArray( new JpaSelection<?>[0] ) );
569568
//noinspection unchecked
570-
querySpec.setSelection( (JpaSelection<S>) ( newSelections.size() == 1 ?
571-
newSelections.iterator().next() :
572-
nodeBuilder().tuple( newSelections.toArray( new JpaSelection<?>[0] ) ) ) );
569+
querySpec.setSelection( (JpaSelection<S>) selection );
573570
}
574571
else {
575572
( (SqmQueryGroup<?>) queryPart ).getQueryParts().forEach( this::aliasSelections );

hibernate-core/src/main/java/org/hibernate/query/sqm/tree/select/SqmSubQuery.java

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -274,9 +274,7 @@ public SqmSubQuery<T> select(Expression<T> expression) {
274274
@SuppressWarnings("unchecked")
275275
public SqmSubQuery<T> multiselect(Selection<?>... selections) {
276276
validateComplianceMultiselect();
277-
278277
final Selection<? extends T> resultSelection = getResultSelection( selections );
279-
280278
final SqmQuerySpec<T> querySpec = getQuerySpec();
281279
if ( querySpec.getSelectClause() == null ) {
282280
querySpec.setSelectClause( new SqmSelectClause( false, 1, nodeBuilder() ) );
@@ -286,36 +284,38 @@ public SqmSubQuery<T> multiselect(Selection<?>... selections) {
286284
}
287285

288286
@Override
289-
@SuppressWarnings("unchecked")
290287
public SqmSubQuery<T> multiselect(List<Selection<?>> selectionList) {
291288
validateComplianceMultiselect();
289+
final SqmQuerySpec<T> querySpec = getQuerySpec();
290+
if ( querySpec.getSelectClause() == null ) {
291+
querySpec.setSelectClause( new SqmSelectClause( false, 1, nodeBuilder() ) );
292+
}
293+
querySpec.setSelection( getResultSelection( selectionList ) );
294+
return this;
295+
}
292296

293-
final Selection<? extends T> resultSelection;
297+
private JpaSelection<T> getResultSelection(List<Selection<?>> selections) {
294298
final Class<T> resultType = getResultType();
295-
final List<? extends Selection<?>> selections = (List<? extends JpaSelection<?>>) (List<?>) selectionList;
296299
if ( resultType == null || resultType == Object.class ) {
297-
resultSelection = switch ( selections.size() ) {
298-
case 0 -> throw new IllegalArgumentException( "empty selections passed to criteria query typed as Object" );
299-
case 1 -> (Selection<? extends T>) selections.get( 0 );
300-
default -> (Selection<? extends T>) nodeBuilder().array( selectionList );
300+
final JpaSelection<?> selection = switch ( selections.size() ) {
301+
case 0 -> throw new IllegalArgumentException(
302+
"empty selections passed to criteria query typed as Object" );
303+
case 1 -> (JpaSelection<?>) selections.get( 0 );
304+
default -> nodeBuilder().array( selections );
301305
};
306+
//noinspection unchecked
307+
return (JpaSelection<T>) selection;
302308
}
303309
else if ( Tuple.class.isAssignableFrom( resultType ) ) {
304-
resultSelection = ( Selection<? extends T> ) nodeBuilder().tuple( selectionList );
310+
//noinspection unchecked
311+
return (JpaSelection<T>) nodeBuilder().tuple( selections );
305312
}
306313
else if ( resultType.isArray() ) {
307-
resultSelection = nodeBuilder().array( resultType, selections );
314+
return nodeBuilder().array( resultType, selections );
308315
}
309316
else {
310-
resultSelection = nodeBuilder().construct( resultType, selections );
311-
}
312-
final SqmQuerySpec<T> querySpec = getQuerySpec();
313-
if ( querySpec.getSelectClause() == null ) {
314-
querySpec.setSelectClause( new SqmSelectClause( false, 1, nodeBuilder() ) );
317+
return nodeBuilder().construct( resultType, selections );
315318
}
316-
querySpec.setSelection( (JpaSelection<T>) resultSelection );
317-
318-
return this;
319319
}
320320

321321
@Override

0 commit comments

Comments
 (0)