diff --git a/hibernate-core/src/main/java/org/hibernate/boot/query/HbmResultSetMappingDescriptor.java b/hibernate-core/src/main/java/org/hibernate/boot/query/HbmResultSetMappingDescriptor.java index 3f4f32e9fa..d5a8e9a845 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/query/HbmResultSetMappingDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/query/HbmResultSetMappingDescriptor.java @@ -670,7 +670,7 @@ public class HbmResultSetMappingDescriptor implements NamedResultSetMappingDescr ) ); } - fetchable = (Fetchable) ( (FetchableContainer) fetchable ).findSubPart( propertyPathParts[i], null ); + fetchable = (Fetchable) ( (FetchableContainer) fetchable.getPartMappingType() ).findSubPart( propertyPathParts[i], null ); navigablePath = navigablePath.append( fetchable.getFetchableName() ); } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java index 3e0a47dec4..a66eb91502 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java @@ -1829,7 +1829,7 @@ public abstract class AbstractEntityPersister return fetches.build(); } - protected boolean isSelectable(FetchParent fetchParent, Fetchable fetchable) { + public boolean isSelectable(FetchParent fetchParent, Fetchable fetchable) { if ( fetchParent instanceof EmbeddableResultGraphNode ) { return true; } @@ -4159,6 +4159,11 @@ public abstract class AbstractEntityPersister return entityMetamodel.getCascadeStyles(); } + @Override + public boolean isPropertySelectable(int propertyNumber) { + return propertySelectable[propertyNumber]; + } + @Override public final Class getMappedClass() { return this.getMappedJavaType().getJavaTypeClass(); diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/EntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/EntityPersister.java index 0b9abeafea..379fdad589 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/EntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/EntityPersister.java @@ -674,6 +674,10 @@ public interface EntityPersister extends EntityMappingType, RootTableGroupProduc */ CascadeStyle[] getPropertyCascadeStyles(); + default boolean isPropertySelectable(int propertyNumber) { + return true; + } + /** * Get the identifier type */ diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/DomainResultCreationStateImpl.java b/hibernate-core/src/main/java/org/hibernate/query/results/DomainResultCreationStateImpl.java index e98faec967..fed159ca04 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/DomainResultCreationStateImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/DomainResultCreationStateImpl.java @@ -29,6 +29,7 @@ import org.hibernate.metamodel.mapping.ModelPart; import org.hibernate.metamodel.mapping.NonAggregatedIdentifierMapping; import org.hibernate.metamodel.mapping.internal.BasicValuedCollectionPart; import org.hibernate.metamodel.mapping.internal.SingleAttributeIdentifierMapping; +import org.hibernate.persister.entity.AbstractEntityPersister; import org.hibernate.spi.EntityIdentifierNavigablePath; import org.hibernate.spi.NavigablePath; import org.hibernate.query.results.dynamic.DynamicFetchBuilderLegacy; @@ -428,6 +429,11 @@ public class DomainResultCreationStateImpl private Consumer createFetchableConsumer(FetchParent fetchParent, ImmutableFetchList.Builder fetches) { return fetchable -> { + final FetchableContainer parentMappingType = fetchParent.getReferencedMappingContainer(); + if ( parentMappingType instanceof AbstractEntityPersister + && !( ( (AbstractEntityPersister) parentMappingType ).isSelectable( fetchParent, fetchable ) ) ) { + return; + } final String fetchableName = fetchable.getFetchableName(); Map.Entry currentEntry; if ( relativePathStack.isEmpty() ) { diff --git a/hibernate-core/src/main/java/org/hibernate/query/results/dynamic/DynamicResultBuilderEntityStandard.java b/hibernate-core/src/main/java/org/hibernate/query/results/dynamic/DynamicResultBuilderEntityStandard.java index b5200a0d5d..17aab3d405 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/results/dynamic/DynamicResultBuilderEntityStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/query/results/dynamic/DynamicResultBuilderEntityStandard.java @@ -187,7 +187,7 @@ public class DynamicResultBuilderEntityStandard final NavigablePath elementNavigablePath; if ( fetchable instanceof PluralAttributeMapping ) { collectionTableGroup = fromClauseAccess.getTableGroup( navigablePath ); - elementNavigablePath = navigablePath.append( fetchable.getPartName() ); + elementNavigablePath = navigablePath.append( CollectionPart.Nature.ELEMENT.getName() ); } else { collectionTableGroup = null; diff --git a/hibernate-core/src/main/java/org/hibernate/query/sql/internal/ResultSetMappingProcessor.java b/hibernate-core/src/main/java/org/hibernate/query/sql/internal/ResultSetMappingProcessor.java index 8825408176..c410037906 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sql/internal/ResultSetMappingProcessor.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sql/internal/ResultSetMappingProcessor.java @@ -323,7 +323,12 @@ public class ResultSetMappingProcessor implements SQLQueryParser.ParserContext { resultBuilderEntity.addProperty( loadable.getIdentifierPropertyName(), identifierAliases ); } - for ( String propertyName : loadable.getPropertyNames() ) { + final String[] propertyNames = loadable.getPropertyNames(); + for ( int i = 0; i < propertyNames.length; i++ ) { + if ( !loadable.isPropertySelectable( i ) ) { + continue; + } + final String propertyName = propertyNames[i]; final String[] columnAliases = loadable.getSubclassPropertyColumnAliases( propertyName, suffix ); final Type propertyType = loadable.getPropertyType( propertyName ); addFetchBuilder(