mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-02-07 11:48:18 +00:00
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:
parent
e3ccfdf829
commit
869d857823
@ -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;
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user