Skip to content

Commit 2f5256a

Browse files
committed
HHH-18450 Handle array result types for multi-valued parameters
Also fix an NPE in SqmSelectionQueryImpl#determineResultType
1 parent f46c87d commit 2f5256a

File tree

2 files changed

+19
-9
lines changed

2 files changed

+19
-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: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -827,10 +827,19 @@ 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 assignable to the result type
835+
if ( expectedResultType.isArray() ) {
836+
final SqmParameter<?> parameter = (SqmParameter<?>) selection.getSelectableNode();
837+
return parameter.allowMultiValuedBinding();
838+
}
839+
else {
840+
return true;
841+
}
842+
}
834843
else if ( selection == null
835844
|| !isHqlTuple( selection ) && selection.getSelectableNode().isCompoundSelection() ) {
836845
return false;

0 commit comments

Comments
 (0)