Skip to content

Commit 6d8b5f3

Browse files
committed
HHH-18720 Type check on select columns in union all gives SemanticException when there is a null column
1 parent 29092bd commit 6d8b5f3

File tree

2 files changed

+22
-5
lines changed

2 files changed

+22
-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
@@ -170,7 +170,8 @@ private void validateQueryGroupFetchStructure(List<? extends SqmTypedNode<?>> ty
170170
for ( int j = 0; j < firstSelectionSize; j++ ) {
171171
final SqmTypedNode<?> firstSqmSelection = typedNodes.get( j );
172172
final JavaType<?> firstJavaType = firstSqmSelection.getNodeJavaType();
173-
if ( firstJavaType != selections.get( j ).getNodeJavaType() ) {
173+
final JavaType<?> nodeJavaType = selections.get( j ).getNodeJavaType();
174+
if ( nodeJavaType != null && firstJavaType != null && firstJavaType != nodeJavaType ) {
174175
throw new SemanticException(
175176
"Select items of the same index must have the same java type across all query parts"
176177
);

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

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,15 @@
99
import org.hibernate.engine.spi.SessionFactoryImplementor;
1010
import org.hibernate.query.results.ResultSetMapping;
1111
import org.hibernate.query.results.ResultSetMappingImpl;
12+
import org.hibernate.sql.ast.spi.SqlSelection;
13+
import org.hibernate.sql.ast.tree.select.QueryGroup;
14+
import org.hibernate.sql.ast.tree.select.QueryPart;
1215
import org.hibernate.sql.ast.tree.select.SelectStatement;
1316
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMappingProducer;
1417
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMappingProducerProvider;
18+
import org.hibernate.type.descriptor.jdbc.NullJdbcType;
19+
20+
import java.util.List;
1521

1622
/**
1723
* Standard JdbcValuesMappingProducerProvider implementation
@@ -28,10 +34,20 @@ public class JdbcValuesMappingProducerProviderStandard implements JdbcValuesMapp
2834
public JdbcValuesMappingProducer buildMappingProducer(
2935
SelectStatement sqlAst,
3036
SessionFactoryImplementor sessionFactory) {
31-
return new JdbcValuesMappingProducerStandard(
32-
sqlAst.getQuerySpec().getSelectClause().getSqlSelections(),
33-
sqlAst.getDomainResultDescriptors()
34-
);
37+
return new JdbcValuesMappingProducerStandard( getSelections( sqlAst ), sqlAst.getDomainResultDescriptors() );
38+
}
39+
40+
private static List<SqlSelection> getSelections(SelectStatement selectStatement) {
41+
if ( selectStatement.getQueryPart() instanceof QueryGroup ) {
42+
final QueryGroup queryGroup = (QueryGroup) selectStatement.getQueryPart();
43+
for ( QueryPart queryPart : queryGroup.getQueryParts() ) {
44+
if ( !(queryPart.getFirstQuerySpec().getSelectClause().getSqlSelections()
45+
.get( 0 ).getExpressionType().getSingleJdbcMapping().getJdbcType() instanceof NullJdbcType) ) {
46+
return queryPart.getFirstQuerySpec().getSelectClause().getSqlSelections();
47+
}
48+
}
49+
}
50+
return selectStatement.getQuerySpec().getSelectClause().getSqlSelections();
3551
}
3652

3753
@Override

0 commit comments

Comments
 (0)