HHH-18138 entity graphs must respect concrete generic attribute
Co-authored-by: Marco Belladelli <marcobladel@gmail.com>
This commit is contained in:
parent
7ef0680601
commit
81d700c382
|
@ -23,6 +23,7 @@ import org.hibernate.graph.spi.RootGraphImplementor;
|
||||||
import org.hibernate.metamodel.model.domain.EntityDomainType;
|
import org.hibernate.metamodel.model.domain.EntityDomainType;
|
||||||
import org.hibernate.metamodel.model.domain.ManagedDomainType;
|
import org.hibernate.metamodel.model.domain.ManagedDomainType;
|
||||||
import org.hibernate.metamodel.model.domain.PersistentAttribute;
|
import org.hibernate.metamodel.model.domain.PersistentAttribute;
|
||||||
|
import org.hibernate.query.sqm.SqmPathSource;
|
||||||
|
|
||||||
import static java.util.Collections.emptyList;
|
import static java.util.Collections.emptyList;
|
||||||
|
|
||||||
|
@ -123,7 +124,10 @@ public abstract class AbstractGraph<J> extends AbstractGraphNode<J> implements G
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public <AJ> AttributeNodeImplementor<AJ> findAttributeNode(String attributeName) {
|
public <AJ> AttributeNodeImplementor<AJ> findAttributeNode(String attributeName) {
|
||||||
final PersistentAttribute<? super J, ?> attribute = managedType.findAttributeInSuperTypes( attributeName );
|
PersistentAttribute<? super J, ?> attribute = managedType.findAttributeInSuperTypes( attributeName );
|
||||||
|
if ( attribute instanceof SqmPathSource && ( (SqmPathSource<?>) attribute ).isGeneric() ) {
|
||||||
|
attribute = managedType.findConcreteGenericAttribute( attributeName );
|
||||||
|
}
|
||||||
return attribute == null ? null : findAttributeNode( (PersistentAttribute<? extends J, AJ>) attribute );
|
return attribute == null ? null : findAttributeNode( (PersistentAttribute<? extends J, AJ>) attribute );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ import org.hibernate.graph.CannotBecomeEntityGraphException;
|
||||||
import org.hibernate.graph.CannotContainSubGraphException;
|
import org.hibernate.graph.CannotContainSubGraphException;
|
||||||
import org.hibernate.graph.Graph;
|
import org.hibernate.graph.Graph;
|
||||||
import org.hibernate.metamodel.model.domain.PersistentAttribute;
|
import org.hibernate.metamodel.model.domain.PersistentAttribute;
|
||||||
|
import org.hibernate.query.sqm.SqmPathSource;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Integration version of the {@link Graph} contract
|
* Integration version of the {@link Graph} contract
|
||||||
|
@ -74,7 +75,12 @@ public interface GraphImplementor<J> extends Graph<J>, GraphNodeImplementor<J> {
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
default <AJ> AttributeNodeImplementor<AJ> findOrCreateAttributeNode(String name) {
|
default <AJ> AttributeNodeImplementor<AJ> findOrCreateAttributeNode(String name) {
|
||||||
return findOrCreateAttributeNode( (PersistentAttribute<? extends J,AJ>) getGraphedType().getAttribute( name ) );
|
PersistentAttribute<? super J, ?> attribute = getGraphedType().getAttribute( name );
|
||||||
|
if ( attribute instanceof SqmPathSource && ( (SqmPathSource<?>) attribute ).isGeneric() ) {
|
||||||
|
attribute = getGraphedType().findConcreteGenericAttribute( name );
|
||||||
|
}
|
||||||
|
|
||||||
|
return findOrCreateAttributeNode( (PersistentAttribute<? extends J, AJ>) attribute );
|
||||||
}
|
}
|
||||||
|
|
||||||
<AJ> AttributeNodeImplementor<AJ> findOrCreateAttributeNode(PersistentAttribute<? extends J, AJ> attribute);
|
<AJ> AttributeNodeImplementor<AJ> findOrCreateAttributeNode(PersistentAttribute<? extends J, AJ> attribute);
|
||||||
|
|
Loading…
Reference in New Issue