4040import org .hibernate .mapping .Subclass ;
4141import org .hibernate .mapping .Table ;
4242import org .hibernate .metamodel .mapping .EntityDiscriminatorMapping ;
43+ import org .hibernate .metamodel .mapping .SelectableConsumer ;
4344import org .hibernate .metamodel .mapping .SelectableMapping ;
4445import org .hibernate .metamodel .mapping .internal .MappingModelCreationProcess ;
46+ import org .hibernate .metamodel .spi .MappingMetamodelImplementor ;
4547import org .hibernate .metamodel .spi .RuntimeModelCreationContext ;
4648import org .hibernate .persister .spi .PersisterCreationContext ;
4749import org .hibernate .query .spi .NavigablePath ;
@@ -382,11 +384,6 @@ protected boolean hasMultipleTables() {
382384
383385 @ Override
384386 public void pruneForSubclasses (TableGroup tableGroup , Set <String > treatedEntityNames ) {
385- // If the base type is part of the treatedEntityNames this means we can't optimize this,
386- // as the table group is e.g. returned through a select
387- if ( treatedEntityNames .contains ( getEntityName () ) ) {
388- return ;
389- }
390387 final NamedTableReference tableReference = (NamedTableReference ) tableGroup .resolveTableReference ( getRootTableName () );
391388 // Replace the default union sub-query with a specially created one that only selects the tables for the treated entity names
392389 tableReference .setPrunedTableExpression ( generateSubquery ( treatedEntityNames ) );
@@ -496,33 +493,40 @@ protected String generateSubquery(Set<String> treated) {
496493 }
497494
498495 final Dialect dialect = getFactory ().getJdbcServices ().getDialect ();
496+ final MappingMetamodelImplementor metamodel = getFactory ().getRuntimeMetamodels ().getMappingMetamodel ();
499497
500498 // Collect all selectables of every entity subtype and group by selection expression as well as table name
501499 final LinkedHashMap <String , Map <String , SelectableMapping >> selectables = new LinkedHashMap <>();
502- visitSubTypeAttributeMappings (
503- attributeMapping -> attributeMapping .forEachSelectable (
504- (i , selectable ) -> selectables .computeIfAbsent ( selectable .getSelectionExpression (), k -> new HashMap <>() )
505- .put ( selectable .getContainingTableExpression (), selectable )
506- )
507- );
500+ final SelectableConsumer selectableConsumer = (i , selectable ) -> {
501+ selectables .computeIfAbsent ( selectable .getSelectionExpression (), k -> new HashMap <>() )
502+ .put ( selectable .getContainingTableExpression (), selectable );
503+ };
508504 // Collect the concrete subclass table names for the treated entity names
509505 final Set <String > treatedTableNames = new HashSet <>( treated .size () );
510506 for ( String subclassName : treated ) {
511507 final UnionSubclassEntityPersister subPersister =
512- (UnionSubclassEntityPersister ) getSubclassMappingType ( subclassName );
508+ (UnionSubclassEntityPersister ) metamodel . getEntityDescriptor ( subclassName );
513509 for ( String subclassTableName : subPersister .getSubclassTableNames () ) {
514510 if ( ArrayHelper .indexOf ( subclassSpaces , subclassTableName ) != -1 ) {
515511 treatedTableNames .add ( subclassTableName );
516512 }
517513 }
514+ subPersister .getIdentifierMapping ().forEachSelectable ( selectableConsumer );
515+ if ( subPersister .getVersionMapping () != null ) {
516+ subPersister .getVersionMapping ().forEachSelectable ( selectableConsumer );
517+ }
518+ subPersister .visitSubTypeAttributeMappings (
519+ attributeMapping -> attributeMapping .forEachSelectable ( selectableConsumer )
520+ );
518521 }
519522
520523 // Create a union sub-query for the table names, like generateSubquery(PersistentClass model, Mapping mapping)
521524 final StringBuilder buf = new StringBuilder ( subquery .length () )
522525 .append ( "( " );
523526
524- for ( int i = 0 ; i < subclassTableNames .length ; i ++ ) {
525- final String subclassTableName = subclassTableNames [i ];
527+ for ( String name : getEntityMetamodel ().getSubclassEntityNames () ) {
528+ final AbstractEntityPersister persister = (AbstractEntityPersister ) metamodel .findEntityDescriptor ( name );
529+ final String subclassTableName = persister .getTableName ();
526530 if ( treatedTableNames .contains ( subclassTableName ) ) {
527531 buf .append ( "select " );
528532 for ( Map <String , SelectableMapping > selectableMappings : selectables .values () ) {
@@ -540,7 +544,7 @@ protected String generateSubquery(Set<String> treated) {
540544 );
541545 buf .append ( ", " );
542546 }
543- buf .append ( i ).append ( " as clazz_" );
547+ buf .append ( persister . getDiscriminatorSQLValue () ).append ( " as clazz_" );
544548 buf .append ( " from " ).append ( subclassTableName );
545549 buf .append ( " union " );
546550 if ( dialect .supportsUnionAll () ) {
0 commit comments