|  | 
| 58 | 58 | import org.hibernate.property.access.internal.PropertyAccessMapImpl; | 
| 59 | 59 | import org.hibernate.property.access.spi.Getter; | 
| 60 | 60 | import org.hibernate.query.sqm.tree.domain.SqmDomainType; | 
|  | 61 | +import org.hibernate.query.sqm.tree.domain.SqmMappedSuperclassDomainType; | 
| 61 | 62 | import org.hibernate.type.AnyType; | 
| 62 | 63 | import org.hibernate.type.BasicType; | 
| 63 | 64 | import org.hibernate.type.CollectionType; | 
| @@ -740,56 +741,70 @@ private static Member resolveMappedSuperclassMember( | 
| 740 | 741 | 			Property property, | 
| 741 | 742 | 			MappedSuperclassDomainType<?> ownerType, | 
| 742 | 743 | 			MetadataContext context) { | 
| 743 |  | -		final EntityPersister declaringEntity = | 
| 744 |  | -				getDeclaringEntity( (AbstractIdentifiableType<?>) ownerType, context ); | 
| 745 |  | -		if ( declaringEntity != null ) { | 
| 746 |  | -			return resolveEntityMember( property, declaringEntity ); | 
| 747 |  | -		} | 
| 748 |  | -		else { | 
| 749 |  | -			final ManagedDomainType<?> subType = ownerType.getSubTypes().iterator().next(); | 
| 750 |  | -			final Type.PersistenceType persistenceType = subType.getPersistenceType(); | 
| 751 |  | -			return switch ( persistenceType ) { | 
| 752 |  | -				case ENTITY -> | 
| 753 |  | -						resolveEntityMember( property, | 
| 754 |  | -								getDeclaringEntity( (AbstractIdentifiableType<?>) subType, context ) ); | 
| 755 |  | -				case MAPPED_SUPERCLASS -> | 
| 756 |  | -						resolveMappedSuperclassMember( property, (MappedSuperclassDomainType<?>) subType, context ); | 
| 757 |  | -				case EMBEDDABLE -> | 
| 758 |  | -						resolveEmbeddedMember( property, (EmbeddableDomainType<?>) subType, context ); | 
| 759 |  | -				default -> throw new IllegalArgumentException( "Unexpected PersistenceType: " + persistenceType ); | 
| 760 |  | -			}; | 
| 761 |  | -		} | 
|  | 744 | +		return property.getGetter( ownerType.getJavaType() ).getMember(); | 
|  | 745 | +//		final EntityPersister declaringEntity = | 
|  | 746 | +//				getDeclaringEntity( (AbstractIdentifiableType<?>) ownerType, context ); | 
|  | 747 | +//		if ( declaringEntity != null ) { | 
|  | 748 | +//			return resolveEntityMember( property, declaringEntity ); | 
|  | 749 | +//		} | 
|  | 750 | +//		else { | 
|  | 751 | +//			final ManagedDomainType<?> subType = ownerType.getSubTypes().iterator().next(); | 
|  | 752 | +//			final Type.PersistenceType persistenceType = subType.getPersistenceType(); | 
|  | 753 | +//			return switch ( persistenceType ) { | 
|  | 754 | +//				case ENTITY -> | 
|  | 755 | +//						resolveEntityMember( property, | 
|  | 756 | +//								getDeclaringEntity( (AbstractIdentifiableType<?>) subType, context ) ); | 
|  | 757 | +//				case MAPPED_SUPERCLASS -> | 
|  | 758 | +//						resolveMappedSuperclassMember( property, (MappedSuperclassDomainType<?>) subType, context ); | 
|  | 759 | +//				case EMBEDDABLE -> | 
|  | 760 | +//						resolveEmbeddedMember( property, (EmbeddableDomainType<?>) subType, context ); | 
|  | 761 | +//				default -> throw new IllegalArgumentException( "Unexpected PersistenceType: " + persistenceType ); | 
|  | 762 | +//			}; | 
|  | 763 | +//		} | 
| 762 | 764 | 	} | 
| 763 | 765 | 
 | 
| 764 | 766 | 	private final MemberResolver identifierMemberResolver = (attributeContext, metadataContext) -> { | 
| 765 | 767 | 		final AbstractIdentifiableType<?> identifiableType = | 
| 766 | 768 | 				(AbstractIdentifiableType<?>) attributeContext.getOwnerType(); | 
| 767 |  | -		final EntityPersister declaringEntityMapping = getDeclaringEntity( identifiableType, metadataContext ); | 
| 768 |  | -		final EntityIdentifierMapping identifierMapping = declaringEntityMapping.getIdentifierMapping(); | 
| 769 |  | -		final Property propertyMapping = attributeContext.getPropertyMapping(); | 
| 770 |  | -		return !propertyMapping.getName().equals( identifierMapping.getAttributeName() ) | 
| 771 |  | -				// this *should* indicate processing part of an IdClass... | 
| 772 |  | -				? virtualIdentifierMemberResolver.resolveMember( attributeContext, metadataContext ) | 
| 773 |  | -				: getter( declaringEntityMapping, propertyMapping, | 
| 774 |  | -						identifierMapping.getAttributeName(), identifierMapping.getJavaType().getJavaTypeClass() ); | 
| 775 |  | - | 
|  | 769 | +		if ( identifiableType instanceof SqmMappedSuperclassDomainType<?> ) { | 
|  | 770 | +			return attributeContext.getPropertyMapping() | 
|  | 771 | +					.getGetter( identifiableType.getJavaType() ) | 
|  | 772 | +					.getMember(); | 
|  | 773 | +		} | 
|  | 774 | +		else { | 
|  | 775 | +			final EntityPersister declaringEntityMapping = getDeclaringEntity( identifiableType, metadataContext ); | 
|  | 776 | +			final EntityIdentifierMapping identifierMapping = declaringEntityMapping.getIdentifierMapping(); | 
|  | 777 | +			final Property propertyMapping = attributeContext.getPropertyMapping(); | 
|  | 778 | +			return !propertyMapping.getName().equals( identifierMapping.getAttributeName() ) | 
|  | 779 | +					// this *should* indicate processing part of an IdClass... | 
|  | 780 | +					? virtualIdentifierMemberResolver.resolveMember( attributeContext, metadataContext ) | 
|  | 781 | +					: getter( declaringEntityMapping, propertyMapping, | 
|  | 782 | +							identifierMapping.getAttributeName(), identifierMapping.getJavaType().getJavaTypeClass() ); | 
|  | 783 | +		} | 
| 776 | 784 | 	}; | 
| 777 | 785 | 
 | 
| 778 | 786 | 	private final MemberResolver versionMemberResolver = (attributeContext, metadataContext) -> { | 
| 779 | 787 | 		final AbstractIdentifiableType<?> identifiableType = | 
| 780 | 788 | 				(AbstractIdentifiableType<?>) attributeContext.getOwnerType(); | 
| 781 |  | -		final EntityPersister entityPersister = getDeclaringEntity( identifiableType, metadataContext ); | 
| 782 |  | -		final EntityVersionMapping versionMapping = entityPersister.getVersionMapping(); | 
| 783 |  | -		assert entityPersister.isVersioned(); | 
| 784 |  | -		assert versionMapping != null; | 
| 785 |  | - | 
| 786 |  | -		final String versionPropertyName = attributeContext.getPropertyMapping().getName(); | 
| 787 |  | -		if ( !versionPropertyName.equals( versionMapping.getVersionAttribute().getAttributeName() ) ) { | 
| 788 |  | -			// this should never happen, but to be safe... | 
| 789 |  | -			throw new IllegalArgumentException( "Given property did not match declared version property" ); | 
| 790 |  | -		} | 
| 791 |  | -		return getter( entityPersister, attributeContext.getPropertyMapping(), | 
| 792 |  | -				versionPropertyName, versionMapping.getJavaType().getJavaTypeClass() ); | 
|  | 789 | +		if ( identifiableType instanceof SqmMappedSuperclassDomainType<?> ) { | 
|  | 790 | +			return attributeContext.getPropertyMapping() | 
|  | 791 | +					.getGetter( identifiableType.getJavaType() ) | 
|  | 792 | +					.getMember(); | 
|  | 793 | +		} | 
|  | 794 | +		else { | 
|  | 795 | +			final EntityPersister entityPersister = getDeclaringEntity( identifiableType, metadataContext ); | 
|  | 796 | +			final EntityVersionMapping versionMapping = entityPersister.getVersionMapping(); | 
|  | 797 | +			assert entityPersister.isVersioned(); | 
|  | 798 | +			assert versionMapping != null; | 
|  | 799 | + | 
|  | 800 | +			final String versionPropertyName = attributeContext.getPropertyMapping().getName(); | 
|  | 801 | +			if ( !versionPropertyName.equals( versionMapping.getVersionAttribute().getAttributeName() ) ) { | 
|  | 802 | +				// this should never happen, but to be safe... | 
|  | 803 | +				throw new IllegalArgumentException( "Given property did not match declared version property" ); | 
|  | 804 | +			} | 
|  | 805 | +			return getter( entityPersister, attributeContext.getPropertyMapping(), | 
|  | 806 | +					versionPropertyName, versionMapping.getJavaType().getJavaTypeClass() ); | 
|  | 807 | +		} | 
| 793 | 808 | 	}; | 
| 794 | 809 | 
 | 
| 795 | 810 | 	private static Member getter(EntityPersister persister, Property property, String name, Class<?> type) { | 
|  | 
0 commit comments