Skip to content

Commit 691604d

Browse files
committed
HHH-18610 ColumnReferenceKey for discriminator
1 parent bfaf3c5 commit 691604d

File tree

3 files changed

+53
-8
lines changed

3 files changed

+53
-8
lines changed

hibernate-core/src/main/java/org/hibernate/query/results/internal/ResultsHelper.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55
package org.hibernate.query.results.internal;
66

7+
import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping;
78
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
89
import org.hibernate.metamodel.mapping.ModelPart;
910
import org.hibernate.metamodel.mapping.SelectableMapping;
@@ -19,6 +20,7 @@
1920
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata;
2021

2122
import static org.hibernate.sql.ast.spi.SqlExpressionResolver.createColumnReferenceKey;
23+
import static org.hibernate.sql.ast.spi.SqlExpressionResolver.createDiscriminatorColumnReferenceKey;
2224

2325
/**
2426
* @author Steve Ebersole
@@ -65,6 +67,25 @@ public static Expression resolveSqlExpression(
6567
);
6668
}
6769

70+
public static Expression resolveSqlExpression(
71+
DomainResultCreationStateImpl resolver,
72+
JdbcValuesMetadata jdbcValuesMetadata,
73+
TableReference tableReference,
74+
EntityDiscriminatorMapping discriminatorMapping,
75+
String columnAlias) {
76+
return resolver.resolveSqlExpression(
77+
createDiscriminatorColumnReferenceKey(
78+
tableReference,
79+
discriminatorMapping
80+
),
81+
processingState -> {
82+
final int jdbcPosition = jdbcValuesMetadata.resolveColumnPosition( columnAlias );
83+
final int valuesArrayPosition = jdbcPositionToValuesArrayPosition( jdbcPosition );
84+
return new ResultSetMappingSqlSelection( valuesArrayPosition, discriminatorMapping.getJdbcMapping() );
85+
}
86+
);
87+
}
88+
6889
public static Expression resolveSqlExpression(
6990
DomainResultCreationStateImpl resolver,
7091
TableReference tableReference,

hibernate-core/src/main/java/org/hibernate/query/results/internal/dynamic/DynamicResultBuilderEntityStandard.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.hibernate.LockMode;
88
import org.hibernate.engine.FetchTiming;
99
import org.hibernate.metamodel.mapping.CollectionPart;
10+
import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping;
1011
import org.hibernate.metamodel.mapping.EntityMappingType;
1112
import org.hibernate.metamodel.mapping.ModelPart;
1213
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
@@ -259,7 +260,7 @@ else if ( idFetchBuilder != null ) {
259260
}
260261

261262
if ( discriminatorColumnName != null ) {
262-
resolveSqlSelection(
263+
resolveDiscriminatorSqlSelection(
263264
discriminatorColumnName,
264265
tableReference,
265266
entityMapping.getDiscriminatorMapping(),
@@ -284,6 +285,25 @@ else if ( idFetchBuilder != null ) {
284285
}
285286
}
286287

288+
private static void resolveDiscriminatorSqlSelection(String columnAlias, TableReference tableReference, EntityDiscriminatorMapping discriminatorMapping, JdbcValuesMetadata jdbcResultsMetadata, DomainResultCreationState domainResultCreationState) {
289+
final DomainResultCreationStateImpl creationStateImpl = impl( domainResultCreationState );
290+
creationStateImpl.resolveSqlSelection(
291+
ResultsHelper.resolveSqlExpression(
292+
creationStateImpl,
293+
jdbcResultsMetadata,
294+
tableReference,
295+
discriminatorMapping,
296+
columnAlias
297+
),
298+
discriminatorMapping.getJdbcMapping().getJdbcJavaType(),
299+
null,
300+
domainResultCreationState.getSqlAstCreationState()
301+
.getCreationContext()
302+
.getSessionFactory()
303+
.getTypeConfiguration()
304+
);
305+
}
306+
287307
private FetchBuilder findIdFetchBuilder() {
288308
return findFetchBuilder( entityMapping.getIdentifierMapping() );
289309
}

hibernate-core/src/main/java/org/hibernate/sql/ast/spi/SqlExpressionResolver.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66

77
import java.util.function.Function;
88

9+
import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping;
910
import org.hibernate.metamodel.mapping.JdbcMapping;
1011
import org.hibernate.metamodel.mapping.SelectableMapping;
1112
import org.hibernate.metamodel.mapping.SelectablePath;
12-
import org.hibernate.metamodel.mapping.internal.DiscriminatorTypeImpl;
1313
import org.hibernate.sql.ast.tree.expression.ColumnReference;
1414
import org.hibernate.sql.ast.tree.expression.Expression;
1515
import org.hibernate.sql.ast.tree.expression.NestedColumnReference;
@@ -91,6 +91,15 @@ static ColumnReferenceKey createColumnReferenceKey(TableReference tableReference
9191
return createColumnReferenceKey( tableReference, selectable.getSelectablePath(), selectable.getJdbcMapping() );
9292
}
9393

94+
/**
95+
* Convenience form for creating a key from TableReference and EntityDiscriminatorMapping
96+
*/
97+
static ColumnReferenceKey createDiscriminatorColumnReferenceKey(TableReference tableReference, EntityDiscriminatorMapping discriminatorMapping) {
98+
assert tableReference.containsAffectedTableName( discriminatorMapping.getContainingTableExpression() )
99+
: String.format( ROOT, "Expecting tables to match between TableReference (%s) and SelectableMapping (%s)", tableReference.getTableId(), discriminatorMapping.getContainingTableExpression() );
100+
return createColumnReferenceKey( tableReference, discriminatorMapping.getSelectablePath(), discriminatorMapping.getUnderlyingJdbcMapping() );
101+
}
102+
94103
default Expression resolveSqlExpression(TableReference tableReference, SelectableMapping selectableMapping) {
95104
return resolveSqlExpression(
96105
createColumnReferenceKey( tableReference, selectableMapping ),
@@ -127,12 +136,7 @@ final class ColumnReferenceKey {
127136
public ColumnReferenceKey(String tableQualifier, SelectablePath selectablePath, JdbcMapping jdbcMapping) {
128137
this.tableQualifier = tableQualifier;
129138
this.selectablePath = selectablePath;
130-
if ( jdbcMapping instanceof DiscriminatorTypeImpl discriminatorType ) {
131-
this.jdbcMapping = discriminatorType.getUnderlyingJdbcMapping();
132-
}
133-
else {
134-
this.jdbcMapping = jdbcMapping;
135-
}
139+
this.jdbcMapping = jdbcMapping;
136140
}
137141

138142
@Override

0 commit comments

Comments
 (0)