Skip to content

Commit cda7dad

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

File tree

2 files changed

+17
-9
lines changed

2 files changed

+17
-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
@@ -64,6 +64,7 @@
6464
import org.hibernate.sql.results.internal.TupleMetadata;
6565
import org.hibernate.sql.results.spi.ResultsConsumer;
6666
import org.hibernate.sql.results.spi.SingleResultConsumer;
67+
import org.hibernate.type.descriptor.java.JavaType;
6768

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

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.hibernate.metamodel.model.domain.SingularPersistentAttribute;
4747
import org.hibernate.metamodel.model.domain.internal.EntitySqmPathSource;
4848
import org.hibernate.persister.entity.EntityPersister;
49+
import org.hibernate.query.BindableType;
4950
import org.hibernate.query.IllegalQueryOperationException;
5051
import org.hibernate.query.IllegalSelectQueryException;
5152
import org.hibernate.query.Order;
@@ -853,10 +854,16 @@ static JpaOrder sortSpecification(SqmSelectStatement<?> sqm, Order<?> order) {
853854
}
854855

855856
public static boolean isSelectionAssignableToResultType(SqmSelection<?> selection, Class<?> expectedResultType) {
856-
if ( expectedResultType == null
857-
|| selection != null && selection.getSelectableNode() instanceof SqmParameter ) {
857+
if ( expectedResultType == null ) {
858858
return true;
859859
}
860+
else if ( selection != null && selection.getSelectableNode() instanceof SqmParameter<?> ) {
861+
final SqmParameter<?> sqmParameter = (SqmParameter<?>) selection.getSelectableNode();
862+
final Class<?> anticipatedClass = sqmParameter.getAnticipatedType() != null ?
863+
sqmParameter.getAnticipatedType().getBindableJavaType() :
864+
null;
865+
return anticipatedClass != null && expectedResultType.isAssignableFrom( anticipatedClass );
866+
}
860867
else if ( selection == null
861868
|| !isHqlTuple( selection ) && selection.getSelectableNode().isCompoundSelection() ) {
862869
return false;

0 commit comments

Comments
 (0)