Skip to content

Commit 3521857

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

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-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: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.hibernate.metamodel.model.domain.SingularPersistentAttribute;
4444
import org.hibernate.metamodel.model.domain.internal.EntitySqmPathSource;
4545
import org.hibernate.persister.entity.EntityPersister;
46+
import org.hibernate.query.BindableType;
4647
import org.hibernate.query.IllegalQueryOperationException;
4748
import org.hibernate.query.IllegalSelectQueryException;
4849
import org.hibernate.query.Order;
@@ -827,10 +828,15 @@ static JpaOrder sortSpecification(SqmSelectStatement<?> sqm, Order<?> order) {
827828
}
828829

829830
public static boolean isSelectionAssignableToResultType(SqmSelection<?> selection, Class<?> expectedResultType) {
830-
if ( expectedResultType == null
831-
|| selection != null && selection.getSelectableNode() instanceof SqmParameter ) {
831+
if ( expectedResultType == null ) {
832832
return true;
833833
}
834+
else if ( selection != null && selection.getSelectableNode() instanceof SqmParameter<?> sqmParameter ) {
835+
final Class<?> anticipatedClass = sqmParameter.getAnticipatedType() != null ?
836+
sqmParameter.getAnticipatedType().getBindableJavaType() :
837+
null;
838+
return anticipatedClass != null && expectedResultType.isAssignableFrom( anticipatedClass );
839+
}
834840
else if ( selection == null
835841
|| !isHqlTuple( selection ) && selection.getSelectableNode().isCompoundSelection() ) {
836842
return false;

0 commit comments

Comments
 (0)