Skip to content

Commit 82c3985

Browse files
committed
HHH-18450 Handle array result types for multi-valued parameters
Also fix an NPE in SqmSelectionQueryImpl#determineResultType
1 parent 21f88b0 commit 82c3985

File tree

2 files changed

+13
-9
lines changed

2 files changed

+13
-9
lines changed

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import org.hibernate.sql.results.internal.TupleMetadata;
6464
import org.hibernate.sql.results.spi.ResultsConsumer;
6565
import org.hibernate.sql.results.spi.SingleResultConsumer;
66+
import org.hibernate.type.descriptor.java.JavaType;
6667

6768
import static org.hibernate.jpa.HibernateHints.HINT_CACHEABLE;
6869
import static org.hibernate.jpa.HibernateHints.HINT_CACHE_MODE;
@@ -276,15 +277,15 @@ private static Class<?> determineResultType(SqmSelectStatement<?> sqm, Class<?>
276277
return Object[].class;
277278
}
278279
else {
279-
final SqmSelection<?> selection = selections.get(0);
280+
final SqmSelection<?> selection = selections.get( 0 );
280281
if ( isSelectionAssignableToResultType( selection, expectedResultType ) ) {
281-
return selection.getNodeJavaType().getJavaTypeClass();
282-
}
283-
else {
284-
// let's assume there's some
285-
// way to instantiate it
286-
return expectedResultType;
282+
final JavaType<?> nodeJavaType = selection.getNodeJavaType();
283+
if ( nodeJavaType != null ) {
284+
return nodeJavaType.getJavaTypeClass();
285+
}
287286
}
287+
// let's assume there's some way to instantiate it
288+
return expectedResultType;
288289
}
289290
}
290291
else if ( expectedResultType != null ) {

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -827,10 +827,13 @@ static JpaOrder sortSpecification(SqmSelectStatement<?> sqm, Order<?> order) {
827827
}
828828

829829
public static boolean isSelectionAssignableToResultType(SqmSelection<?> selection, Class<?> expectedResultType) {
830-
if ( expectedResultType == null
831-
|| selection != null && selection.getSelectableNode() instanceof SqmParameter ) {
830+
if ( expectedResultType == null ) {
832831
return true;
833832
}
833+
else if ( selection != null && selection.getSelectableNode() instanceof SqmParameter ) {
834+
// assume the parameter type is not assignable to the result type
835+
return false;
836+
}
834837
else if ( selection == null
835838
|| !isHqlTuple( selection ) && selection.getSelectableNode().isCompoundSelection() ) {
836839
return false;

0 commit comments

Comments
 (0)