HHH-16988 Fix and simplify the getNavigablePathCopy method

Handle implicitly treated navigable paths copy correctly.
Also, small change to findPluralAttribute() to correctly handle multiple inheritance types.
This commit is contained in:
Marco Belladelli 2023-07-31 12:08:26 +02:00
parent e3ccfdf829
commit 869d857823
2 changed files with 29 additions and 20 deletions

View File

@ -377,7 +377,7 @@ protected <Y> boolean isPrimitiveVariant(SingularAttribute<?,?> attribute, Class
return attribute; return attribute;
} }
else if ( getSuperType() != null ) { else if ( getSuperType() != null ) {
return getSuperType().findDeclaredPluralAttribute( name ); return getSuperType().findPluralAttribute( name );
} }
else { else {
return null; return null;

View File

@ -27,6 +27,7 @@
import org.hibernate.query.sqm.tree.expression.SqmLiteral; import org.hibernate.query.sqm.tree.expression.SqmLiteral;
import org.hibernate.spi.EntityIdentifierNavigablePath; import org.hibernate.spi.EntityIdentifierNavigablePath;
import org.hibernate.spi.NavigablePath; import org.hibernate.spi.NavigablePath;
import org.hibernate.spi.TreatedNavigablePath;
import jakarta.persistence.metamodel.MapAttribute; import jakarta.persistence.metamodel.MapAttribute;
import jakarta.persistence.metamodel.PluralAttribute; import jakarta.persistence.metamodel.PluralAttribute;
@ -226,37 +227,45 @@ protected <S extends T> SqmTreatedPath<T, S> getTreatedPath(EntityDomainType<S>
* and if not creates a copy of the navigable path with the correct parent. * and if not creates a copy of the navigable path with the correct parent.
*/ */
protected NavigablePath getNavigablePathCopy(SqmPath<?> parent) { protected NavigablePath getNavigablePathCopy(SqmPath<?> parent) {
return getNavigablePathCopy( castNonNull( navigablePath.getRealParent() ), parent.getNavigablePath(), false, null ); final NavigablePath realParentPath = getRealParentPath(
castNonNull( navigablePath.getRealParent() ),
parent.getNavigablePath()
);
if ( realParentPath != null ) {
return realParentPath.append( navigablePath.getLocalName(), navigablePath.getAlias() );
}
return navigablePath;
} }
private NavigablePath getNavigablePathCopy( private NavigablePath getRealParentPath(NavigablePath realParent, NavigablePath parent) {
NavigablePath realParent,
NavigablePath parent,
boolean isId,
String identifierAttributeName) {
if ( parent == realParent ) { if ( parent == realParent ) {
return navigablePath; return null;
} }
else if ( !isId && realParent instanceof EntityIdentifierNavigablePath ) { else if ( realParent instanceof EntityIdentifierNavigablePath ) {
return getNavigablePathCopy( parent = getRealParentPath( castNonNull( realParent.getRealParent() ), parent );
castNonNull( realParent.getRealParent() ), if ( parent != null ) {
parent, parent = new EntityIdentifierNavigablePath(
true, parent,
( (EntityIdentifierNavigablePath) realParent ).getIdentifierAttributeName() ( (EntityIdentifierNavigablePath) realParent ).getIdentifierAttributeName()
); );
}
}
else if ( realParent.getAlias() == null && realParent instanceof TreatedNavigablePath ) {
// This might be an implicitly treated parent path, check with the non-treated parent
parent = getRealParentPath( castNonNull( realParent.getRealParent() ), parent );
if ( parent != null ) {
parent = parent.treatAs( realParent.getLocalName().substring( 1 ) );
}
} }
else if ( CollectionPart.Nature.fromNameExact( realParent.getLocalName() ) != null ) { else if ( CollectionPart.Nature.fromNameExact( realParent.getLocalName() ) != null ) {
if ( parent == realParent.getRealParent() ) { if ( parent == realParent.getRealParent() ) {
return navigablePath; return null;
} }
else { else {
parent = parent.append( realParent.getLocalName() ); parent = parent.append( realParent.getLocalName() );
} }
} }
if ( isId ) { return parent;
parent = new EntityIdentifierNavigablePath( parent, identifierAttributeName );
}
return parent.append( navigablePath.getLocalName(), navigablePath.getAlias() );
} }
@Override @Override