diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/AbstractEntityInitializer.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/AbstractEntityInitializer.java index b3d0e7a55d..99c09c633d 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/AbstractEntityInitializer.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/AbstractEntityInitializer.java @@ -419,7 +419,7 @@ protected boolean shouldSkipResolveInstance(RowProcessingState rowProcessingStat .getEntityMetamodel() .isPolymorphic() ) { parentInitializer.resolveKey( rowProcessingState ); - return isReferencedModelPartInConcreteParent( + return !isReferencedModelPartInConcreteParent( modelPart, currentNavigablePath, parentInitializer @@ -437,7 +437,13 @@ private boolean isReferencedModelPartInConcreteParent( final EntityPersister parentConcreteDescriptor = parentInitializer.asEntityInitializer() .getConcreteDescriptor(); if ( parentConcreteDescriptor != null && parentConcreteDescriptor.getEntityMetamodel().isPolymorphic() ) { - final ModelPart concreteModelPart = parentConcreteDescriptor.findByPath( partNavigablePath.getLocalName() ); + final EntityMappingType entityType = modelPart.asAttributeMapping() != null ? + modelPart.asAttributeMapping().getDeclaringType().findContainingEntityMapping() : + modelPart.asEntityMappingType(); + final ModelPart concreteModelPart = parentConcreteDescriptor.findSubPart( + partNavigablePath.getLocalName(), + entityType + ); if ( concreteModelPart == null || !modelPart.getJavaType().getJavaTypeClass() .isAssignableFrom( concreteModelPart.getJavaType().getJavaTypeClass() ) ) { @@ -470,10 +476,10 @@ class AddressB extends Address{ and for AddressB skip resolving the EntityJoinedFetchInitializer of UserA */ - return true; + return false; } } - return false; + return true; } protected void resolveEntityInstance(