diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/PathSource.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/PathSource.java index 1267d534f034..6fd4037718bc 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/PathSource.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/PathSource.java @@ -4,9 +4,18 @@ */ package org.hibernate.metamodel.model.domain; -import jakarta.persistence.metamodel.Bindable; import org.hibernate.spi.NavigablePath; +/** + * Any element of the domain model which can be used to create an + * element of a path expression in a query. + * + * @param The type of path element this source creates. + * + * @since 7.0 + * + * @author Gavin King + */ public interface PathSource { /** * The name of this thing. @@ -17,8 +26,6 @@ public interface PathSource { /** * The type of path this source creates. - * - * @apiNote Analogous to {@link Bindable#getBindableJavaType()}. */ DomainType getPathType(); diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractAttribute.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractAttribute.java index 01cf6e104c4b..22b999de5b4c 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractAttribute.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractAttribute.java @@ -11,10 +11,15 @@ import jakarta.persistence.metamodel.Attribute; import org.hibernate.metamodel.AttributeClassification; +import org.hibernate.metamodel.mapping.CollectionPart; import org.hibernate.metamodel.model.domain.DomainType; +import org.hibernate.metamodel.model.domain.EntityDomainType; import org.hibernate.metamodel.model.domain.ManagedDomainType; -import org.hibernate.metamodel.model.domain.PersistentAttribute; +import org.hibernate.metamodel.model.domain.PluralPersistentAttribute; import org.hibernate.query.sqm.tree.domain.SqmDomainType; +import org.hibernate.query.sqm.tree.domain.SqmPath; +import org.hibernate.query.sqm.tree.domain.SqmPersistentAttribute; +import org.hibernate.spi.NavigablePath; import org.hibernate.type.descriptor.java.JavaType; /** @@ -25,7 +30,8 @@ * * @author Steve Ebersole */ -public abstract class AbstractAttribute implements PersistentAttribute, Serializable { +public abstract class AbstractAttribute + implements SqmPersistentAttribute, Serializable { private final ManagedDomainType declaringType; private final String name; private final JavaType attributeJtd; @@ -96,6 +102,26 @@ public DomainType getValueGraphType() { return valueType; } + NavigablePath getParentNavigablePath(SqmPath parent) { + final var parentPathSource = parent.getResolvedModel(); + final var parentType = parentPathSource.getPathType(); + final NavigablePath parentNavigablePath = + parentPathSource instanceof PluralPersistentAttribute + // for collections, implicitly navigate to the element + ? parent.getNavigablePath().append( CollectionPart.Nature.ELEMENT.getName() ) + : parent.getNavigablePath(); + if ( parentType != declaringType + && parentType instanceof EntityDomainType entityDomainType + && entityDomainType.findAttribute( name ) == null ) { + // If the parent path is an entity type which does not contain the + // joined attribute add an implicit treat to the parent's navigable path + return parentNavigablePath.treatAs( declaringType.getTypeName() ); + } + else { + return parentNavigablePath; + } + } + @Override public String toString() { return declaringType.getTypeName() + '#' + name + '(' + attributeClassification + ')'; diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractIdentifiableType.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractIdentifiableType.java index 22c90d3ce4a7..d6c5ce323cdd 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractIdentifiableType.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractIdentifiableType.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Set; import java.util.function.Consumer; + import jakarta.persistence.metamodel.Bindable; import jakarta.persistence.metamodel.IdentifiableType; import jakarta.persistence.metamodel.SingularAttribute; @@ -26,6 +27,7 @@ import org.hibernate.metamodel.model.domain.SingularPersistentAttribute; import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor; import org.hibernate.query.sqm.SqmPathSource; +import org.hibernate.query.sqm.tree.domain.SqmPersistentAttribute; import org.hibernate.query.sqm.tree.domain.SqmSingularPersistentAttribute; import org.hibernate.query.sqm.tree.domain.SqmEmbeddableDomainType; import org.hibernate.type.descriptor.java.JavaType; @@ -33,7 +35,7 @@ import org.jboss.logging.Logger; -import static java.util.Collections.emptySet; +import static java.util.Collections.emptyList; /** * Functionality common to all implementations of {@link IdentifiableType}. @@ -57,14 +59,14 @@ public abstract class AbstractIdentifiableType private final boolean hasIdClass; private SqmSingularPersistentAttribute id; - private Set> nonAggregatedIdAttributes; + private List> nonAggregatedIdAttributes; private SqmEmbeddableDomainType idClassType; private SqmPathSource identifierDescriptor; private final boolean isVersioned; - private SingularPersistentAttribute versionAttribute; - private List> naturalIdAttributes; + private SqmSingularPersistentAttribute versionAttribute; + private List> naturalIdAttributes; public AbstractIdentifiableType( String typeName, @@ -112,13 +114,13 @@ public IdentifiableDomainType getSupertype() { @Override @SuppressWarnings("unchecked") - public SingularPersistentAttribute getId(Class javaType) { + public SqmSingularPersistentAttribute getId(Class javaType) { ensureNoIdClass(); final var id = findIdAttribute(); if ( id != null ) { checkType( id, javaType ); } - return (SingularPersistentAttribute) id; + return (SqmSingularPersistentAttribute) id; } private void ensureNoIdClass() { @@ -131,7 +133,7 @@ private void ensureNoIdClass() { @Override - public SingularPersistentAttribute findIdAttribute() { + public SqmSingularPersistentAttribute findIdAttribute() { if ( id != null ) { return id; } @@ -163,13 +165,13 @@ private void checkType(SingularPersistentAttribute attribute, Class jav @Override @SuppressWarnings("unchecked") - public SingularPersistentAttribute getDeclaredId(Class javaType) { + public SqmSingularPersistentAttribute getDeclaredId(Class javaType) { ensureNoIdClass(); if ( id == null ) { throw new IllegalArgumentException( "The id attribute is not declared on this type [" + getTypeName() + "]" ); } checkType( id, javaType ); - return (SingularPersistentAttribute) id; + return (SqmSingularPersistentAttribute) id; } @Override @@ -318,7 +320,7 @@ private void checkDeclaredVersion() { * * @return The declared */ - public SingularAttribute getDeclaredVersion() { + public SqmSingularPersistentAttribute getDeclaredVersion() { checkDeclaredVersion(); return versionAttribute; } @@ -349,10 +351,12 @@ public void applyNonAggregatedIdAttributes( } if ( idAttributes.isEmpty() ) { - nonAggregatedIdAttributes = emptySet(); + nonAggregatedIdAttributes = emptyList(); } else { + nonAggregatedIdAttributes = new ArrayList<>(idAttributes.size()); for ( var idAttribute : idAttributes ) { + nonAggregatedIdAttributes.add( (SqmSingularPersistentAttribute) idAttribute ); if ( AbstractIdentifiableType.this == idAttribute.getDeclaringType() ) { @SuppressWarnings("unchecked") // Safe, because we know it's declared by this type @@ -361,8 +365,6 @@ public void applyNonAggregatedIdAttributes( addAttribute( declaredAttribute ); } } - - nonAggregatedIdAttributes = idAttributes; } AbstractIdentifiableType.this.idClassType = (SqmEmbeddableDomainType) idClassType; } @@ -374,7 +376,8 @@ public void applyIdClassAttributes(Set @Override public void applyVersionAttribute(SingularPersistentAttribute versionAttribute) { - AbstractIdentifiableType.this.versionAttribute = versionAttribute; + AbstractIdentifiableType.this.versionAttribute = + (SqmSingularPersistentAttribute) versionAttribute; managedTypeAccess.addAttribute( versionAttribute ); } @@ -383,7 +386,7 @@ public void applyNaturalIdAttribute(PersistentAttribute naturalIdAttribute if ( naturalIdAttributes == null ) { naturalIdAttributes = new ArrayList<>(); } - naturalIdAttributes.add( naturalIdAttribute ); + naturalIdAttributes.add( (SqmPersistentAttribute) naturalIdAttribute ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractManagedType.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractManagedType.java index 8e855589bf04..0de20ee6e2e3 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractManagedType.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractManagedType.java @@ -33,10 +33,13 @@ import org.hibernate.metamodel.model.domain.ManagedDomainType; import org.hibernate.metamodel.model.domain.MapPersistentAttribute; import org.hibernate.metamodel.model.domain.PersistentAttribute; -import org.hibernate.metamodel.model.domain.PluralPersistentAttribute; import org.hibernate.metamodel.model.domain.SetPersistentAttribute; import org.hibernate.metamodel.model.domain.SingularPersistentAttribute; import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor; +import org.hibernate.query.sqm.tree.domain.SqmManagedDomainType; +import org.hibernate.query.sqm.tree.domain.SqmPersistentAttribute; +import org.hibernate.query.sqm.tree.domain.SqmPluralPersistentAttribute; +import org.hibernate.query.sqm.tree.domain.SqmSingularPersistentAttribute; import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.descriptor.java.spi.DynamicModelJavaType; @@ -50,18 +53,18 @@ */ public abstract class AbstractManagedType extends AbstractDomainType - implements ManagedDomainType, AttributeContainer, Serializable { + implements SqmManagedDomainType, AttributeContainer, Serializable { private final String hibernateTypeName; - private final ManagedDomainType supertype; + private final SqmManagedDomainType supertype; private final RepresentationMode representationMode; private final JpaMetamodelImplementor metamodel; - private final Map> declaredSingularAttributes = new LinkedHashMap<>(); - private volatile Map> declaredPluralAttributes ; - private volatile Map> declaredConcreteGenericAttributes; + private final Map> declaredSingularAttributes = new LinkedHashMap<>(); + private volatile Map> declaredPluralAttributes ; + private volatile Map> declaredConcreteGenericAttributes; - private final List> subtypes = new ArrayList<>(); + private final List> subtypes = new ArrayList<>(); protected AbstractManagedType( String hibernateTypeName, @@ -70,7 +73,8 @@ protected AbstractManagedType( JpaMetamodelImplementor metamodel) { super( javaType ); this.hibernateTypeName = hibernateTypeName; - this.supertype = supertype; + // TODO: fix callers and remove this typecast + this.supertype = (SqmManagedDomainType) supertype; this.metamodel = metamodel; if ( supertype != null ) { supertype.addSubType( this ); @@ -104,18 +108,18 @@ public Class getBindableJavaType() { } @Override - public ManagedDomainType getSuperType() { + public SqmManagedDomainType getSuperType() { return supertype; } @Override - public Collection> getSubTypes() { + public Collection> getSubTypes() { return subtypes; } @Override public void addSubType(ManagedDomainType subType){ - subtypes.add( subType ); + subtypes.add( (SqmManagedDomainType) subType ); } @Override @@ -169,14 +173,14 @@ else if ( !isDeclaredSingularAttributesEmpty ) { } @Override - public PersistentAttribute getAttribute(String name) { - final PersistentAttribute attribute = findAttribute( name ); + public SqmPersistentAttribute getAttribute(String name) { + final var attribute = findAttribute( name ); checkNotNull( "Attribute", attribute, name ); return attribute; } @Override - public PersistentAttribute findAttribute(String name) { + public SqmPersistentAttribute findAttribute(String name) { final var attribute = findDeclaredAttribute( name ); if ( attribute != null ) { return attribute; @@ -187,7 +191,7 @@ public PersistentAttribute findAttribute(String name) { } @Override - public final PersistentAttribute findAttributeInSuperTypes(String name) { + public final SqmPersistentAttribute findAttributeInSuperTypes(String name) { final var attribute = findDeclaredAttribute( name ); if ( attribute != null ) { return attribute; @@ -198,7 +202,7 @@ public PersistentAttribute findAttribute(String name) { } @Override - public PersistentAttribute findSubTypesAttribute(String name) { + public SqmPersistentAttribute findSubTypesAttribute(String name) { final var attribute = findDeclaredAttribute( name ); if ( attribute != null ) { return attribute; @@ -215,7 +219,7 @@ public PersistentAttribute findAttribute(String name) { } @Override - public PersistentAttribute findDeclaredAttribute(String name) { + public SqmPersistentAttribute findDeclaredAttribute(String name) { // try singular attribute final var attribute = declaredSingularAttributes.get( name ); if ( attribute != null ) { @@ -282,7 +286,7 @@ public String getTypeName() { } @Override - public SingularPersistentAttribute findSingularAttribute(String name) { + public SqmSingularPersistentAttribute findSingularAttribute(String name) { final var attribute = findDeclaredSingularAttribute( name ); return attribute == null && getSuperType() != null ? getSuperType().findSingularAttribute( name ) @@ -290,7 +294,7 @@ public String getTypeName() { } @Override - public SingularPersistentAttribute getSingularAttribute(String name, Class type) { + public SqmSingularPersistentAttribute getSingularAttribute(String name, Class type) { return checkTypeForSingleAttribute( findSingularAttribute( name ), name, type ); } @@ -302,7 +306,7 @@ public SingularPersistentAttribute getSingularAttribute(String } @Override - public SingularPersistentAttribute findDeclaredSingularAttribute(String name) { + public SqmSingularPersistentAttribute findDeclaredSingularAttribute(String name) { return declaredSingularAttributes.get( name ); } @@ -311,8 +315,8 @@ public SingularPersistentAttribute getDeclaredSingularAttribute(String return checkTypeForSingleAttribute( findDeclaredSingularAttribute( name ), name, javaType ); } - private SingularPersistentAttribute checkTypeForSingleAttribute( - SingularPersistentAttribute attribute, + private SqmSingularPersistentAttribute checkTypeForSingleAttribute( + SqmSingularPersistentAttribute attribute, String name, Class javaType) { if ( attribute == null || !hasMatchingReturnType( attribute, javaType ) ) { @@ -324,8 +328,8 @@ private SingularPersistentAttribute checkTypeForSingleAttribute( } else { @SuppressWarnings("unchecked") - final SingularPersistentAttribute narrowed = - (SingularPersistentAttribute) attribute; + final SqmSingularPersistentAttribute narrowed = + (SqmSingularPersistentAttribute) attribute; return narrowed; } } @@ -389,7 +393,7 @@ protected boolean isPrimitiveVariant(SingularAttribute attribute, Class } @Override - public PluralPersistentAttribute findPluralAttribute(String name) { + public SqmPluralPersistentAttribute findPluralAttribute(String name) { var attribute = findDeclaredPluralAttribute( name ); if ( attribute != null ) { return attribute; @@ -403,7 +407,7 @@ else if ( getSuperType() != null ) { } @Override - public PluralPersistentAttribute findDeclaredPluralAttribute(String name) { + public SqmPluralPersistentAttribute findDeclaredPluralAttribute(String name) { return declaredPluralAttributes == null ? null : declaredPluralAttributes.get( name ); } @@ -429,7 +433,7 @@ private void checkTypeForPluralAttributes( // Generic attributes @Override - public PersistentAttribute findConcreteGenericAttribute(String name) { + public SqmPersistentAttribute findConcreteGenericAttribute(String name) { final var attribute = findDeclaredConcreteGenericAttribute( name ); return attribute == null && getSuperType() != null ? getSuperType().findDeclaredConcreteGenericAttribute( name ) @@ -437,7 +441,7 @@ private void checkTypeForPluralAttributes( } @Override - public PersistentAttribute findDeclaredConcreteGenericAttribute(String name) { + public SqmPersistentAttribute findDeclaredConcreteGenericAttribute(String name) { return declaredConcreteGenericAttributes == null ? null : declaredConcreteGenericAttributes.get( name ); } @@ -687,10 +691,10 @@ public InFlightAccess getInFlightAccess() { protected class InFlightAccessImpl implements InFlightAccess { @Override public void addAttribute(PersistentAttribute attribute) { - if ( attribute instanceof SingularPersistentAttribute singularAttribute ) { + if ( attribute instanceof SqmSingularPersistentAttribute singularAttribute ) { declaredSingularAttributes.put( attribute.getName(), singularAttribute ); } - else if ( attribute instanceof PluralPersistentAttribute pluralAttribute ) { + else if ( attribute instanceof SqmPluralPersistentAttribute pluralAttribute ) { if ( declaredPluralAttributes == null ) { declaredPluralAttributes = new HashMap<>(); } @@ -708,7 +712,8 @@ public void addConcreteGenericAttribute(PersistentAttribute attribute) { if ( declaredConcreteGenericAttributes == null ) { declaredConcreteGenericAttributes = new HashMap<>(); } - declaredConcreteGenericAttributes.put( attribute.getName(), attribute ); + declaredConcreteGenericAttributes.put( attribute.getName(), + (SqmPersistentAttribute) attribute ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractPluralAttribute.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractPluralAttribute.java index df9d74327348..a64903f12b89 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractPluralAttribute.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/AbstractPluralAttribute.java @@ -10,9 +10,6 @@ import org.hibernate.metamodel.CollectionClassification; import org.hibernate.metamodel.internal.MetadataContext; import org.hibernate.metamodel.mapping.CollectionPart; -import org.hibernate.metamodel.model.domain.DomainType; -import org.hibernate.metamodel.model.domain.EntityDomainType; -import org.hibernate.metamodel.model.domain.PluralPersistentAttribute; import org.hibernate.metamodel.model.domain.SimpleDomainType; import org.hibernate.query.sqm.tree.domain.SqmPluralPersistentAttribute; import org.hibernate.spi.NavigablePath; @@ -170,19 +167,7 @@ public NavigablePath createNavigablePath(SqmPath parent, String alias) { "`lhs` cannot be null for a sub-navigable reference - " + getName() ); } - final SqmPathSource parentPathSource = parent.getResolvedModel(); - NavigablePath navigablePath = parent.getNavigablePath(); - if ( parentPathSource instanceof PluralPersistentAttribute ) { - navigablePath = navigablePath.append( CollectionPart.Nature.ELEMENT.getName() ); - } - final DomainType parentType = parentPathSource.getPathType(); - if ( parentType != getDeclaringType() && parentType instanceof EntityDomainType && - ( (EntityDomainType) parentType ).findPluralAttribute( getName() ) == null ) { - // If the parent path is an entity type which does not contain the joined attribute - // add an implicit treat to the parent's navigable path - navigablePath = navigablePath.treatAs( getDeclaringType().getTypeName() ); - } - return buildSubNavigablePath( navigablePath, getName(), alias ); + return buildSubNavigablePath( getParentNavigablePath( parent ), getName(), alias ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddableTypeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddableTypeImpl.java index f316ee270e0a..7c56da50dffc 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddableTypeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EmbeddableTypeImpl.java @@ -10,7 +10,6 @@ import org.hibernate.metamodel.UnsupportedMappingException; import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping; import org.hibernate.metamodel.model.domain.DomainType; -import org.hibernate.metamodel.model.domain.EmbeddableDomainType; import org.hibernate.metamodel.model.domain.ManagedDomainType; import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor; import org.hibernate.query.sqm.SqmPathSource; @@ -59,9 +58,9 @@ public int getTupleLength() { } @Override - public Collection> getSubTypes() { + public Collection> getSubTypes() { //noinspection unchecked - return (Collection>) super.getSubTypes(); + return (Collection>) super.getSubTypes(); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityTypeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityTypeImpl.java index 18192b614791..d9257a05d382 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityTypeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/EntityTypeImpl.java @@ -16,17 +16,17 @@ import org.hibernate.metamodel.UnsupportedMappingException; import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping; import org.hibernate.metamodel.mapping.EntityIdentifierMapping; -import org.hibernate.metamodel.model.domain.EntityDomainType; import org.hibernate.metamodel.model.domain.IdentifiableDomainType; import org.hibernate.metamodel.model.domain.JpaMetamodel; -import org.hibernate.metamodel.model.domain.ManagedDomainType; import org.hibernate.metamodel.model.domain.PersistentAttribute; import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor; import org.hibernate.persister.entity.DiscriminatorMetadata; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.query.PathException; import org.hibernate.query.sqm.SqmPathSource; +import org.hibernate.query.sqm.tree.domain.SqmManagedDomainType; import org.hibernate.query.sqm.tree.domain.SqmPath; +import org.hibernate.query.sqm.tree.domain.SqmPersistentAttribute; import org.hibernate.query.sqm.tree.domain.SqmSingularPersistentAttribute; import org.hibernate.query.sqm.tree.domain.SqmDomainType; import org.hibernate.query.sqm.tree.domain.SqmEntityDomainType; @@ -162,7 +162,7 @@ else if ( EntityDiscriminatorMapping.matchesRoleName( name ) ) { @Override public SqmSingularPersistentAttribute findIdAttribute() { - return (SqmSingularPersistentAttribute) super.findIdAttribute(); + return super.findIdAttribute(); } @Override @@ -195,10 +195,10 @@ else if ( EntityDiscriminatorMapping.matchesRoleName( name ) ) { } } - private PersistentAttribute findSubtypeAttribute(String name) { - PersistentAttribute subtypeAttribute = null; - for ( ManagedDomainType subtype : getSubTypes() ) { - final PersistentAttribute candidate = subtype.findSubTypesAttribute( name ); + private SqmPersistentAttribute findSubtypeAttribute(String name) { + SqmPersistentAttribute subtypeAttribute = null; + for ( SqmManagedDomainType subtype : getSubTypes() ) { + final SqmPersistentAttribute candidate = subtype.findSubTypesAttribute( name ); if ( candidate != null ) { if ( subtypeAttribute != null && !isCompatible( subtypeAttribute, candidate, metamodel.getMappingMetamodel() ) ) { @@ -220,8 +220,8 @@ else if ( EntityDiscriminatorMapping.matchesRoleName( name ) ) { } @Override - public PersistentAttribute findAttribute(String name) { - final PersistentAttribute attribute = super.findAttribute( name ); + public SqmPersistentAttribute findAttribute(String name) { + final var attribute = super.findAttribute( name ); if ( attribute != null ) { return attribute; } @@ -244,9 +244,9 @@ public PersistenceType getPersistenceType() { } @Override - public Collection> getSubTypes() { + public Collection> getSubTypes() { //noinspection unchecked - return (Collection>) super.getSubTypes(); + return (Collection>) super.getSubTypes(); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java index 295dd5467986..63575b0618e7 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/JpaMetamodelImpl.java @@ -377,6 +377,7 @@ public JavaType getJavaConstantType(String className, String fieldName) { public T getJavaConstant(String className, String fieldName) { try { final Field referencedField = getJavaField( className, fieldName ); + //noinspection unchecked return (T) referencedField.get( null ); } catch (NoSuchFieldException | IllegalAccessException e) { diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappedSuperclassTypeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappedSuperclassTypeImpl.java index f86dc11e3032..44f82f6106b4 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappedSuperclassTypeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappedSuperclassTypeImpl.java @@ -13,6 +13,7 @@ import org.hibernate.query.sqm.SqmPathSource; import org.hibernate.query.sqm.tree.domain.SqmPath; import org.hibernate.query.sqm.tree.domain.SqmMappedSuperclassDomainType; +import org.hibernate.query.sqm.tree.domain.SqmPersistentAttribute; import org.hibernate.type.descriptor.java.JavaType; /** @@ -96,8 +97,8 @@ public SqmPathSource getIdentifierDescriptor() { } @Override - public PersistentAttribute findAttribute(String name) { - final PersistentAttribute attribute = super.findAttribute( name ); + public SqmPersistentAttribute findAttribute(String name) { + final var attribute = super.findAttribute( name ); if ( attribute != null ) { return attribute; } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/SingularAttributeImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/SingularAttributeImpl.java index d710bfe2ee2d..cda01decbf0b 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/SingularAttributeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/SingularAttributeImpl.java @@ -11,8 +11,6 @@ import org.hibernate.metamodel.internal.MetadataContext; import org.hibernate.metamodel.mapping.CollectionPart; import org.hibernate.metamodel.model.domain.AnyMappingDomainType; -import org.hibernate.metamodel.model.domain.DomainType; -import org.hibernate.metamodel.model.domain.EntityDomainType; import org.hibernate.metamodel.model.domain.IdentifiableDomainType; import org.hibernate.metamodel.model.domain.ManagedDomainType; import org.hibernate.metamodel.model.domain.PluralPersistentAttribute; @@ -22,7 +20,6 @@ import org.hibernate.query.sqm.SqmPathSource; import org.hibernate.query.hql.spi.SqmCreationState; import org.hibernate.query.sqm.internal.SqmMappingModelHelper; -import org.hibernate.query.sqm.spi.SqmCreationHelper; import org.hibernate.query.sqm.tree.SqmJoinType; import org.hibernate.query.sqm.tree.domain.SqmPath; import org.hibernate.query.sqm.tree.domain.SqmSingularJoin; @@ -40,6 +37,7 @@ import static jakarta.persistence.metamodel.Bindable.BindableType.SINGULAR_ATTRIBUTE; import static org.hibernate.query.sqm.spi.SqmCreationHelper.buildSubNavigablePath; +import static org.hibernate.query.sqm.spi.SqmCreationHelper.determineAlias; /** * @author Emmanuel Bernard @@ -190,19 +188,8 @@ public NavigablePath createNavigablePath(SqmPath parent, String alias) { "LHS cannot be null for a sub-navigable reference - " + getName() ); } - final SqmPathSource parentPathSource = parent.getResolvedModel(); - NavigablePath navigablePath = parent.getNavigablePath(); - if ( parentPathSource instanceof PluralPersistentAttribute ) { - navigablePath = navigablePath.append( CollectionPart.Nature.ELEMENT.getName() ); - } - final DomainType parentType = parentPathSource.getPathType(); - if ( parentType != getDeclaringType() && parentType instanceof EntityDomainType && - ( (EntityDomainType) parentType ).findSingularAttribute( getName() ) == null ) { - // If the parent path is an entity type which does not contain the joined attribute - // add an implicit treat to the parent's navigable path - navigablePath = navigablePath.treatAs( getDeclaringType().getTypeName() ); - } - return buildSubNavigablePath( navigablePath, getName(), alias ); + + return buildSubNavigablePath( getParentNavigablePath( parent ), getName(), alias ); } /** @@ -240,17 +227,19 @@ public NavigablePath createNavigablePath(SqmPath parent, String alias) { "LHS cannot be null for a sub-navigable reference - " + getName() ); } - NavigablePath navigablePath = parent.getNavigablePath(); - if ( parent.getResolvedModel() instanceof PluralPersistentAttribute ) { - navigablePath = navigablePath.append( CollectionPart.Nature.ELEMENT.getName() ); + final SqmPathSource parentPathSource = parent.getResolvedModel(); + final NavigablePath parentNavigablePath = + parentPathSource instanceof PluralPersistentAttribute + ? parent.getNavigablePath().append( CollectionPart.Nature.ELEMENT.getName() ) + : parent.getNavigablePath(); + if ( getDeclaringType() instanceof IdentifiableDomainType declaringType + && !declaringType.hasSingleIdAttribute() ) { + return new EntityIdentifierNavigablePath( parentNavigablePath, null ) + .append( getName(), determineAlias( alias ) ); } - if ( getDeclaringType() instanceof IdentifiableDomainType declaringType ) { - if ( !declaringType.hasSingleIdAttribute() ) { - return new EntityIdentifierNavigablePath( navigablePath, null ) - .append( getName(), SqmCreationHelper.determineAlias( alias ) ); - } + else { + return new EntityIdentifierNavigablePath( parentNavigablePath, determineAlias( alias ), getName() ); } - return new EntityIdentifierNavigablePath( navigablePath, SqmCreationHelper.determineAlias( alias ), getName() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/SqmPathSource.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/SqmPathSource.java index 7a3e6c9bfaa1..35bc794f5ec0 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/SqmPathSource.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/SqmPathSource.java @@ -11,7 +11,6 @@ import org.hibernate.metamodel.model.domain.JpaMetamodel; import org.hibernate.metamodel.model.domain.PathSource; import org.hibernate.query.sqm.tree.domain.SqmDomainType; -import org.hibernate.spi.NavigablePath; import org.hibernate.query.sqm.tree.SqmExpressibleAccessor; import org.hibernate.query.sqm.tree.domain.SqmPath; @@ -27,18 +26,13 @@ */ public interface SqmPathSource extends SqmExpressible, Bindable, SqmExpressibleAccessor, PathSource { - /** - * The name of this thing. - * - * @apiNote Mainly used in logging and when creating a {@link NavigablePath}. - */ - String getPathName(); /** * The type of {@linkplain SqmPath path} this source creates. * * @apiNote Analogous to {@link Bindable#getBindableJavaType()}. */ + @Override SqmDomainType getPathType(); /** diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/spi/SqmCreationHelper.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/spi/SqmCreationHelper.java index d4c1b3cd89e4..1ba493beea19 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/spi/SqmCreationHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/spi/SqmCreationHelper.java @@ -6,7 +6,6 @@ import java.util.List; -import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.metamodel.mapping.CollectionPart; import org.hibernate.metamodel.model.domain.PluralPersistentAttribute; import org.hibernate.query.criteria.JpaPredicate; @@ -19,6 +18,8 @@ import java.util.concurrent.atomic.AtomicLong; +import static org.hibernate.internal.util.collections.CollectionHelper.isEmpty; + /** * @author Steve Ebersole */ @@ -75,7 +76,7 @@ public static NavigablePath buildSubNavigablePath(SqmPath lhs, String subNavi } public static SqmPredicate combinePredicates(SqmPredicate baseRestriction, List incomingRestrictions) { - if ( CollectionHelper.isEmpty( incomingRestrictions ) ) { + if ( isEmpty( incomingRestrictions ) ) { return baseRestriction; } @@ -87,7 +88,7 @@ public static SqmPredicate combinePredicates(SqmPredicate baseRestriction, List< } public static SqmPredicate combinePredicates(SqmPredicate baseRestriction, JpaPredicate... incomingRestrictions) { - if ( CollectionHelper.isEmpty( incomingRestrictions ) ) { + if ( isEmpty( incomingRestrictions ) ) { return baseRestriction; } @@ -99,7 +100,7 @@ public static SqmPredicate combinePredicates(SqmPredicate baseRestriction, JpaPr } public static SqmPredicate combinePredicates(SqmPredicate baseRestriction, Predicate... incomingRestrictions) { - if ( CollectionHelper.isEmpty( incomingRestrictions ) ) { + if ( isEmpty( incomingRestrictions ) ) { return baseRestriction; } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/AbstractSqmPath.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/AbstractSqmPath.java index ac4bd160faee..0a1c37fd9e32 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/AbstractSqmPath.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/AbstractSqmPath.java @@ -156,9 +156,8 @@ public SqmPathSource getModel() { public SqmPathSource getResolvedModel() { final SqmPathSource pathSource = getReferencedPathSource(); if ( pathSource.isGeneric() - && getLhs().getResolvedModel().getPathType() instanceof ManagedDomainType lhsType ) { - final PersistentAttribute concreteAttribute = - lhsType.findConcreteGenericAttribute( pathSource.getPathName() ); + && getLhs().getResolvedModel().getPathType() instanceof SqmManagedDomainType lhsType ) { + final var concreteAttribute = lhsType.findConcreteGenericAttribute( pathSource.getPathName() ); if ( concreteAttribute != null ) { return (SqmPathSource) concreteAttribute; } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmDomainType.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmDomainType.java index 2a0eeccefdc8..ff04c340fd2a 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmDomainType.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmDomainType.java @@ -4,10 +4,12 @@ */ package org.hibernate.query.sqm.tree.domain; +import org.hibernate.Incubating; import org.hibernate.metamodel.model.domain.DomainType; import org.hibernate.query.BindableType; import org.hibernate.query.sqm.SqmExpressible; +@Incubating public interface SqmDomainType extends DomainType, SqmExpressible, BindableType { @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmEmbeddableDomainType.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmEmbeddableDomainType.java index 5231bcc3f2d1..a37add972ea2 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmEmbeddableDomainType.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmEmbeddableDomainType.java @@ -4,8 +4,10 @@ */ package org.hibernate.query.sqm.tree.domain; +import org.hibernate.Incubating; import org.hibernate.metamodel.model.domain.EmbeddableDomainType; +@Incubating public interface SqmEmbeddableDomainType extends EmbeddableDomainType, SqmTreatableDomainType { @Override default SqmEmbeddableDomainType getSqmType() { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmEntityDomainType.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmEntityDomainType.java index cc3d439b541f..6e7fdd5c704f 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmEntityDomainType.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmEntityDomainType.java @@ -4,8 +4,10 @@ */ package org.hibernate.query.sqm.tree.domain; +import org.hibernate.Incubating; import org.hibernate.metamodel.model.domain.EntityDomainType; +@Incubating public interface SqmEntityDomainType extends EntityDomainType, SqmTreatableDomainType { @Override default SqmEntityDomainType getSqmType() { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmManagedDomainType.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmManagedDomainType.java new file mode 100644 index 000000000000..25b314a6ab5a --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmManagedDomainType.java @@ -0,0 +1,46 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.query.sqm.tree.domain; + +import org.hibernate.Incubating; +import org.hibernate.metamodel.model.domain.ManagedDomainType; + +@Incubating +public interface SqmManagedDomainType extends ManagedDomainType, SqmDomainType { + @Override + String getTypeName(); + + @Override + SqmPersistentAttribute findAttribute(String name); + + @Override @Deprecated(since = "7.0", forRemoval = true) + default SqmPersistentAttribute findAttributeInSuperTypes(String name) { + return findAttribute( name ); + } + + @Override + SqmPersistentAttribute findSubTypesAttribute(String name); + + @Override + SqmSingularPersistentAttribute findSingularAttribute(String name); + + @Override + SqmPluralPersistentAttribute findPluralAttribute(String name); + + @Override + SqmPersistentAttribute findDeclaredAttribute(String name); + + @Override + SqmSingularPersistentAttribute findDeclaredSingularAttribute(String name); + + @Override + SqmPluralPersistentAttribute findDeclaredPluralAttribute(String name); + + @Override + SqmPersistentAttribute findConcreteGenericAttribute(String name); + + @Override + SqmPersistentAttribute findDeclaredConcreteGenericAttribute(String name); +} diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmMappedSuperclassDomainType.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmMappedSuperclassDomainType.java index 05cfaef333b1..3c1f5d123e7a 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmMappedSuperclassDomainType.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmMappedSuperclassDomainType.java @@ -4,15 +4,16 @@ */ package org.hibernate.query.sqm.tree.domain; +import org.hibernate.Incubating; import org.hibernate.metamodel.model.domain.MappedSuperclassDomainType; import org.hibernate.query.sqm.SqmPathSource; -public interface SqmMappedSuperclassDomainType extends MappedSuperclassDomainType, SqmPathSource, SqmDomainType { +@Incubating +public interface SqmMappedSuperclassDomainType + extends MappedSuperclassDomainType, SqmPathSource, SqmManagedDomainType { @Override SqmMappedSuperclassDomainType getSqmType(); @Override - default String getTypeName() { - return SqmDomainType.super.getTypeName(); - } + String getTypeName(); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmPersistentAttribute.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmPersistentAttribute.java new file mode 100644 index 000000000000..06d0cfa5ce60 --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmPersistentAttribute.java @@ -0,0 +1,12 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.query.sqm.tree.domain; + +import org.hibernate.Incubating; +import org.hibernate.metamodel.model.domain.PersistentAttribute; + +@Incubating +public interface SqmPersistentAttribute extends PersistentAttribute { +} diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmPluralPersistentAttribute.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmPluralPersistentAttribute.java index 5b206a118a97..1976b0741bc5 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmPluralPersistentAttribute.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmPluralPersistentAttribute.java @@ -4,13 +4,15 @@ */ package org.hibernate.query.sqm.tree.domain; +import org.hibernate.Incubating; import org.hibernate.metamodel.model.domain.PluralPersistentAttribute; import org.hibernate.query.sqm.SqmJoinable; import org.hibernate.query.sqm.SqmPathSource; +@Incubating public interface SqmPluralPersistentAttribute - extends PluralPersistentAttribute, SqmJoinable, SqmPathSource { + extends PluralPersistentAttribute, SqmPersistentAttribute, SqmJoinable, SqmPathSource { @Override SqmPathSource getElementPathSource(); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmPolymorphicRootDescriptor.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmPolymorphicRootDescriptor.java index e04e4798689f..d846efe0aa06 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmPolymorphicRootDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmPolymorphicRootDescriptor.java @@ -45,7 +45,7 @@ public class SqmPolymorphicRootDescriptor implements SqmEntityDomainType { private final Set> implementors; - private final Map> commonAttributes; + private final Map> commonAttributes; private final JavaType polymorphicJavaType; private final JpaMetamodel jpaMetamodel; @@ -70,8 +70,8 @@ public JpaMetamodel getMetamodel() { * The attributes of a "polymorphic" root are the attributes which are * common to all subtypes of the root type. */ - private Map> inferCommonAttributes(Set> implementors) { - final Map> workMap = new HashMap<>(); + private Map> inferCommonAttributes(Set> implementors) { + final Map> workMap = new HashMap<>(); final ArrayList> implementorsList = new ArrayList<>(implementors); final EntityDomainType firstImplementor = implementorsList.get( 0 ); if ( implementorsList.size() == 1 ) { @@ -102,8 +102,8 @@ public JpaMetamodel getMetamodel() { * type cast is actually perfectly correct. */ @SuppressWarnings("unchecked") - private PersistentAttribute promote(PersistentAttribute attribute) { - return (PersistentAttribute) attribute; + private SqmPersistentAttribute promote(PersistentAttribute attribute) { + return (SqmPersistentAttribute) attribute; } private static boolean isACommonAttribute(List> subList, PersistentAttribute attribute) { @@ -176,12 +176,12 @@ public JavaType getExpressibleJavaType() { // Attribute handling @Override - public PersistentAttribute findAttribute(String name) { + public SqmPersistentAttribute findAttribute(String name) { return commonAttributes.get( name ); } @Override - public PersistentAttribute findSubTypesAttribute(String name) { + public SqmPersistentAttribute findSubTypesAttribute(String name) { return commonAttributes.get( name ); } @@ -195,8 +195,8 @@ public void visitDeclaredAttributes(Consumer> } @Override - public PersistentAttribute getAttribute(String name) { - final PersistentAttribute attribute = findAttribute( name ); + public SqmPersistentAttribute getAttribute(String name) { + final var attribute = findAttribute( name ); if ( attribute == null ) { // per-JPA throw new IllegalArgumentException(); @@ -205,42 +205,42 @@ public void visitDeclaredAttributes(Consumer> } @Override - public PersistentAttribute getDeclaredAttribute(String name) { + public SqmPersistentAttribute getDeclaredAttribute(String name) { throw new IllegalArgumentException(); } @Override - public SingularPersistentAttribute findSingularAttribute(String name) { - return (SingularPersistentAttribute) findAttribute( name ); + public SqmSingularPersistentAttribute findSingularAttribute(String name) { + return (SqmSingularPersistentAttribute) findAttribute( name ); } @Override - public PluralPersistentAttribute findPluralAttribute(String name) { - return (PluralPersistentAttribute) findAttribute( name ); + public SqmPluralPersistentAttribute findPluralAttribute(String name) { + return (SqmPluralPersistentAttribute) findAttribute( name ); } @Override - public PersistentAttribute findConcreteGenericAttribute(String name) { + public SqmPersistentAttribute findConcreteGenericAttribute(String name) { return null; } @Override - public PersistentAttribute findDeclaredAttribute(String name) { + public SqmPersistentAttribute findDeclaredAttribute(String name) { return null; } @Override - public SingularPersistentAttribute findDeclaredSingularAttribute(String name) { + public SqmSingularPersistentAttribute findDeclaredSingularAttribute(String name) { return null; } @Override - public PluralPersistentAttribute findDeclaredPluralAttribute(String name) { + public SqmPluralPersistentAttribute findDeclaredPluralAttribute(String name) { return null; } @Override - public PersistentAttribute findDeclaredConcreteGenericAttribute(String name) { + public SqmPersistentAttribute findDeclaredConcreteGenericAttribute(String name) { return null; } @@ -344,7 +344,7 @@ public MapAttribute getDeclaredMap(String name, Class keyType @Override public SingularAttribute getSingularAttribute(String name) { - return (SingularPersistentAttribute) getAttribute( name ); + return (SqmSingularPersistentAttribute) getAttribute( name ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmSingularPersistentAttribute.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmSingularPersistentAttribute.java index be17eed06c22..114d05bfb2a7 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmSingularPersistentAttribute.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmSingularPersistentAttribute.java @@ -4,11 +4,13 @@ */ package org.hibernate.query.sqm.tree.domain; +import org.hibernate.Incubating; import org.hibernate.metamodel.model.domain.SingularPersistentAttribute; import org.hibernate.query.sqm.SqmJoinable; import org.hibernate.query.sqm.SqmPathSource; +@Incubating public interface SqmSingularPersistentAttribute - extends SingularPersistentAttribute, SqmJoinable, SqmPathSource { + extends SingularPersistentAttribute, SqmPersistentAttribute, SqmJoinable, SqmPathSource { SqmPathSource getSqmPathSource(); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmTreatableDomainType.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmTreatableDomainType.java index 52cc7af942d6..17575c17b4b6 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmTreatableDomainType.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmTreatableDomainType.java @@ -4,10 +4,13 @@ */ package org.hibernate.query.sqm.tree.domain; +import org.hibernate.Incubating; import org.hibernate.metamodel.model.domain.TreatableDomainType; import org.hibernate.query.sqm.SqmPathSource; -public interface SqmTreatableDomainType extends TreatableDomainType, SqmPathSource, SqmDomainType { +@Incubating +public interface SqmTreatableDomainType + extends TreatableDomainType, SqmPathSource, SqmManagedDomainType { @Override SqmDomainType getSqmType(); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tuple/internal/AnonymousTupleTableGroupProducer.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tuple/internal/AnonymousTupleTableGroupProducer.java index eefa50b87fd3..8333c3274f3a 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tuple/internal/AnonymousTupleTableGroupProducer.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tuple/internal/AnonymousTupleTableGroupProducer.java @@ -206,9 +206,9 @@ else if ( sqlTypedMappings[selectionIndex] instanceof SelectableMapping selectab (NonAggregatedIdentifierMapping) identifierMapping ); } - if ( existingModelPartContainer instanceof ToOneAttributeMapping ) { + if ( existingModelPart instanceof ToOneAttributeMapping toOneAttributeMapping ) { // We take "ownership" of FK columns by reporting the derived table group is compatible - compatibleTableExpressions.add( ( (ToOneAttributeMapping) existingModelPart ).getIdentifyingColumnsTableExpression() ); + compatibleTableExpressions.add( toOneAttributeMapping.getIdentifyingColumnsTableExpression() ); } return new AnonymousTupleEntityValuedModelPart( newIdentifierMapping, diff --git a/migration-guide.adoc b/migration-guide.adoc index a2cb5710167f..7c7f9a784fef 100644 --- a/migration-guide.adoc +++ b/migration-guide.adoc @@ -225,6 +225,14 @@ All such cases though are already controllable by the application. The effect can also often be mitigated using Hibernate's bytecode-based laziness (possibly combined with `@ConcreteProxy`). +[[domain-metamodel-layering]] +=== Metamodel API layering + +The following changes were made to the package `org.hibernate.metamodel.model.domain` to remove layer-breakers. + +- Domain metamodel types no longer inherit `SqmExpressible` or `SqmPathSource`, and `PathSource` was introduced to compensate. +- `DomainType` no longer extends `BiindableType`. + [[jdbc-exceptions]] === JDBC exception interpretation diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java index 043145667f83..db221cb7e3ba 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/validation/MockSessionFactory.java @@ -61,7 +61,6 @@ import org.hibernate.metamodel.model.domain.EntityDomainType; import org.hibernate.metamodel.model.domain.ManagedDomainType; import org.hibernate.metamodel.model.domain.PersistentAttribute; -import org.hibernate.metamodel.model.domain.internal.AbstractAttribute; import org.hibernate.metamodel.model.domain.internal.AbstractPluralAttribute; import org.hibernate.metamodel.model.domain.internal.BagAttributeImpl; import org.hibernate.metamodel.model.domain.internal.BasicSqmPathSource; @@ -100,6 +99,7 @@ import org.hibernate.query.sqm.internal.SqmCriteriaNodeBuilder; import org.hibernate.query.sqm.sql.SqmTranslatorFactory; import org.hibernate.query.sqm.sql.StandardSqmTranslatorFactory; +import org.hibernate.query.sqm.tree.domain.SqmPersistentAttribute; import org.hibernate.query.sqm.tree.domain.SqmSingularPersistentAttribute; import org.hibernate.query.sqm.tree.domain.SqmDomainType; import org.hibernate.query.sqm.tree.domain.SqmEmbeddableDomainType; @@ -907,7 +907,7 @@ public MockMappedDomainType(String typeName) { } @Override - public PersistentAttribute findDeclaredAttribute(String name) { + public SqmPersistentAttribute findDeclaredAttribute(String name) { final String typeName = getTypeName(); return isFieldDefined(typeName, name) ? createAttribute(name, typeName, propertyType(typeName, name), this) @@ -1018,8 +1018,8 @@ && isSubtype(entityPersister.getEntityName(), getHibernateEntityName())) { } @Override - public PersistentAttribute findAttribute(String name) { - final PersistentAttribute attribute = super.findAttribute(name); + public SqmPersistentAttribute findAttribute(String name) { + final var attribute = super.findAttribute(name); if (attribute != null) { return attribute; } @@ -1030,7 +1030,7 @@ && isSubtype(entityPersister.getEntityName(), getHibernateEntityName())) { } @Override - public PersistentAttribute findDeclaredAttribute(String name) { + public SqmPersistentAttribute findDeclaredAttribute(String name) { final String entityName = getHibernateEntityName(); return isAttributeDefined(entityName, name) ? createAttribute(name, entityName, getReferencedPropertyType(entityName, name), this) @@ -1040,7 +1040,7 @@ public PersistentAttribute findDeclaredAttribute(String name) { protected abstract String getJpaEntityName(String typeName); - private AbstractAttribute createAttribute(String name, String entityName, Type type, ManagedDomainType owner) { + private SqmPersistentAttribute createAttribute(String name, String entityName, Type type, ManagedDomainType owner) { if (type==null) { throw new UnsupportedOperationException(entityName + "." + name); } @@ -1204,7 +1204,7 @@ private EmbeddableTypeImpl createEmbeddableDomainType(String entityName, final JavaType javaType = new UnknownBasicJavaType<>(null, compositeType.getReturnedClassName()); return new EmbeddableTypeImpl<>( javaType, null, null, true, metamodel.getJpaMetamodel() ) { @Override - public PersistentAttribute findAttribute(String name) { + public SqmPersistentAttribute findAttribute(String name) { return createAttribute( name, entityName,