Skip to content

Commit 58254e5

Browse files
committed
HHH-18720 Type check on select columns in union all gives SemanticException when there is a null column
1 parent 8e27a8d commit 58254e5

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,8 @@ private void validateQueryGroupFetchStructure(List<? extends SqmTypedNode<?>> ty
166166
for ( int j = 0; j < firstSelectionSize; j++ ) {
167167
final SqmTypedNode<?> firstSqmSelection = typedNodes.get( j );
168168
final JavaType<?> firstJavaType = firstSqmSelection.getNodeJavaType();
169-
if ( firstJavaType != selections.get( j ).getNodeJavaType() ) {
169+
final JavaType<?> nodeJavaType = selections.get( j ).getNodeJavaType();
170+
if ( nodeJavaType != null && firstJavaType != null && firstJavaType != nodeJavaType ) {
170171
throw new SemanticException(
171172
"Select items of the same index must have the same java type across all query parts"
172173
);

hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/JdbcValuesMappingProducerProviderStandard.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,15 @@
77
import org.hibernate.engine.spi.SessionFactoryImplementor;
88
import org.hibernate.query.results.ResultSetMapping;
99
import org.hibernate.query.results.ResultSetMappingImpl;
10+
import org.hibernate.sql.ast.spi.SqlSelection;
11+
import org.hibernate.sql.ast.tree.select.QueryGroup;
12+
import org.hibernate.sql.ast.tree.select.QueryPart;
1013
import org.hibernate.sql.ast.tree.select.SelectStatement;
1114
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMappingProducer;
1215
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMappingProducerProvider;
16+
import org.hibernate.type.descriptor.jdbc.NullJdbcType;
17+
18+
import java.util.List;
1319

1420
/**
1521
* Standard JdbcValuesMappingProducerProvider implementation
@@ -26,10 +32,19 @@ public class JdbcValuesMappingProducerProviderStandard implements JdbcValuesMapp
2632
public JdbcValuesMappingProducer buildMappingProducer(
2733
SelectStatement sqlAst,
2834
SessionFactoryImplementor sessionFactory) {
29-
return new JdbcValuesMappingProducerStandard(
30-
sqlAst.getQuerySpec().getSelectClause().getSqlSelections(),
31-
sqlAst.getDomainResultDescriptors()
32-
);
35+
return new JdbcValuesMappingProducerStandard( getSelections( sqlAst ), sqlAst.getDomainResultDescriptors() );
36+
}
37+
38+
private static List<SqlSelection> getSelections(SelectStatement selectStatement) {
39+
if ( selectStatement.getQueryPart() instanceof QueryGroup queryGroup ) {
40+
for ( QueryPart queryPart : queryGroup.getQueryParts() ) {
41+
if ( !(queryPart.getFirstQuerySpec().getSelectClause().getSqlSelections()
42+
.get( 0 ).getExpressionType().getSingleJdbcMapping().getJdbcType() instanceof NullJdbcType) ) {
43+
return queryPart.getFirstQuerySpec().getSelectClause().getSqlSelections();
44+
}
45+
}
46+
}
47+
return selectStatement.getQuerySpec().getSelectClause().getSqlSelections();
3348
}
3449

3550
@Override

0 commit comments

Comments
 (0)