This commit is contained in:
Steve Ebersole 2019-09-19 07:36:41 -05:00
parent 05a38d2c7c
commit 055ce0c542
11 changed files with 187 additions and 198 deletions

View File

@ -18,13 +18,12 @@ import org.hibernate.metamodel.mapping.ManagedMappingType;
import org.hibernate.metamodel.mapping.SingularAttributeMapping; import org.hibernate.metamodel.mapping.SingularAttributeMapping;
import org.hibernate.metamodel.mapping.StateArrayContributorMetadataAccess; import org.hibernate.metamodel.mapping.StateArrayContributorMetadataAccess;
import org.hibernate.metamodel.model.convert.spi.BasicValueConverter; import org.hibernate.metamodel.model.convert.spi.BasicValueConverter;
import org.hibernate.metamodel.model.domain.internal.DomainModelHelper;
import org.hibernate.property.access.spi.PropertyAccess; import org.hibernate.property.access.spi.PropertyAccess;
import org.hibernate.query.NavigablePath; import org.hibernate.query.NavigablePath;
import org.hibernate.query.sqm.internal.SqmMappingModelHelper;
import org.hibernate.query.sqm.sql.SqlAstCreationState; import org.hibernate.query.sqm.sql.SqlAstCreationState;
import org.hibernate.query.sqm.sql.SqlExpressionResolver; import org.hibernate.query.sqm.sql.SqlExpressionResolver;
import org.hibernate.sql.ast.Clause; import org.hibernate.sql.ast.Clause;
import org.hibernate.sql.ast.spi.FromClauseAccess;
import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.ast.spi.SqlSelection;
import org.hibernate.sql.ast.tree.expression.ColumnReference; import org.hibernate.sql.ast.tree.expression.ColumnReference;
import org.hibernate.sql.ast.tree.from.TableGroup; import org.hibernate.sql.ast.tree.from.TableGroup;
@ -166,7 +165,7 @@ public class BasicValuedSingularAttributeMapping extends AbstractSingularAttribu
final SqlAstCreationState sqlAstCreationState = creationState.getSqlAstCreationState(); final SqlAstCreationState sqlAstCreationState = creationState.getSqlAstCreationState();
final TableGroup tableGroup = sqlAstCreationState.getFromClauseAccess().resolveTableGroup( final TableGroup tableGroup = sqlAstCreationState.getFromClauseAccess().resolveTableGroup(
fetchParent.getNavigablePath(), fetchParent.getNavigablePath(),
pnp -> DomainModelHelper.resolveLhs( fetchParent.getNavigablePath(), sqlAstCreationState ) pnp -> SqmMappingModelHelper.resolveLhs( fetchParent.getNavigablePath(), sqlAstCreationState )
); );
final SqlSelection sqlSelection = resolveSqlSelection( tableGroup, creationState ); final SqlSelection sqlSelection = resolveSqlSelection( tableGroup, creationState );

View File

@ -23,17 +23,14 @@ import org.hibernate.metamodel.mapping.ManagedMappingType;
import org.hibernate.metamodel.mapping.ModelPart; import org.hibernate.metamodel.mapping.ModelPart;
import org.hibernate.metamodel.mapping.SingularAttributeMapping; import org.hibernate.metamodel.mapping.SingularAttributeMapping;
import org.hibernate.metamodel.mapping.StateArrayContributorMetadataAccess; import org.hibernate.metamodel.mapping.StateArrayContributorMetadataAccess;
import org.hibernate.metamodel.model.domain.internal.DomainModelHelper;
import org.hibernate.property.access.spi.PropertyAccess; import org.hibernate.property.access.spi.PropertyAccess;
import org.hibernate.query.NavigablePath; import org.hibernate.query.NavigablePath;
import org.hibernate.query.sqm.SqmPathSource; import org.hibernate.query.sqm.internal.SqmMappingModelHelper;
import org.hibernate.query.sqm.sql.SqlAstCreationState; import org.hibernate.query.sqm.sql.SqlAstCreationState;
import org.hibernate.query.sqm.sql.SqlExpressionResolver; import org.hibernate.query.sqm.sql.SqlExpressionResolver;
import org.hibernate.query.sqm.sql.SqmToSqlAstConverter; import org.hibernate.query.sqm.sql.SqmToSqlAstConverter;
import org.hibernate.query.sqm.tree.domain.SqmPath;
import org.hibernate.sql.ast.Clause; import org.hibernate.sql.ast.Clause;
import org.hibernate.sql.ast.JoinType; import org.hibernate.sql.ast.JoinType;
import org.hibernate.sql.ast.spi.FromClauseAccess;
import org.hibernate.sql.ast.tree.expression.ColumnReference; import org.hibernate.sql.ast.tree.expression.ColumnReference;
import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.expression.Expression;
import org.hibernate.sql.ast.tree.expression.SqlTuple; import org.hibernate.sql.ast.tree.expression.SqlTuple;
@ -218,7 +215,7 @@ public class EmbeddedAttributeMapping
lnp -> { lnp -> {
// there is not yet a TableGroup associated with this path - create one... // there is not yet a TableGroup associated with this path - create one...
final TableGroup lhsLhsTableGroup = DomainModelHelper.resolveLhs( lhsPath, creationState ); final TableGroup lhsLhsTableGroup = SqmMappingModelHelper.resolveLhs( lhsPath, creationState );
final CompositeTableGroup compositeTableGroup = new CompositeTableGroup( final CompositeTableGroup compositeTableGroup = new CompositeTableGroup(
lnp, lnp,

View File

@ -16,6 +16,7 @@ import org.hibernate.metamodel.model.domain.SimpleDomainType;
import org.hibernate.query.NavigablePath; import org.hibernate.query.NavigablePath;
import org.hibernate.query.sqm.SqmPathSource; import org.hibernate.query.sqm.SqmPathSource;
import org.hibernate.query.hql.spi.SqmCreationState; import org.hibernate.query.hql.spi.SqmCreationState;
import org.hibernate.query.sqm.internal.SqmMappingModelHelper;
import org.hibernate.query.sqm.tree.domain.SqmPath; import org.hibernate.query.sqm.tree.domain.SqmPath;
import org.hibernate.query.sqm.tree.domain.SqmPluralValuedSimplePath; import org.hibernate.query.sqm.tree.domain.SqmPluralValuedSimplePath;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor; import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
@ -51,7 +52,7 @@ public abstract class AbstractPluralAttribute<D,C,E>
this.classification = builder.getCollectionClassification(); this.classification = builder.getCollectionClassification();
this.elementPathSource = DomainModelHelper.resolveSqmPathSource( this.elementPathSource = SqmMappingModelHelper.resolveSqmPathSource(
getName(), getName(),
builder.getValueType(), builder.getValueType(),
BindableType.PLURAL_ATTRIBUTE BindableType.PLURAL_ATTRIBUTE

View File

@ -31,12 +31,7 @@ import org.hibernate.query.sqm.sql.SqlAstCreationState;
import org.hibernate.query.sqm.tree.SqmTypedNode; import org.hibernate.query.sqm.tree.SqmTypedNode;
import org.hibernate.query.sqm.tree.domain.SqmPath; import org.hibernate.query.sqm.tree.domain.SqmPath;
import org.hibernate.query.sqm.tree.domain.SqmTreatedPath; import org.hibernate.query.sqm.tree.domain.SqmTreatedPath;
import org.hibernate.query.sqm.tree.from.SqmFrom;
import org.hibernate.sql.ast.spi.FromClauseAccess;
import org.hibernate.sql.ast.tree.from.TableGroup; import org.hibernate.sql.ast.tree.from.TableGroup;
import org.hibernate.sql.results.spi.DomainResultCreationState;
import org.hibernate.sql.results.spi.Fetch;
import org.hibernate.sql.results.spi.FetchParent;
import org.hibernate.type.BasicType; import org.hibernate.type.BasicType;
/** /**
@ -84,177 +79,4 @@ public class DomainModelHelper {
} }
/**
* Resolve a JPA EntityType descriptor to it's corresponding EntityPersister
* in the Hibernate mapping type system
*/
public static EntityPersister resolveEntityPersister(
EntityDomainType<?> entityType,
SessionFactoryImplementor sessionFactory) {
// Our EntityTypeImpl#getType impl returns the Hibernate entity-name
// which is exactly what we want
final String hibernateEntityName = entityType.getHibernateEntityName();
return sessionFactory.getMetamodel().entityPersister( hibernateEntityName );
}
public static <J> SqmPathSource<J> resolveSqmPathSource(
String name,
DomainType<J> valueDomainType,
Bindable.BindableType jpaBindableType) {
if ( valueDomainType instanceof BasicDomainType ) {
return new BasicSqmPathSource<>(
name,
(BasicDomainType<J>) valueDomainType,
jpaBindableType
);
}
if ( valueDomainType instanceof AnyMappingDomainType ) {
return new AnyMappingSqmPathSource<>(
name,
(AnyMappingDomainType<J>) valueDomainType,
jpaBindableType
);
}
if ( valueDomainType instanceof EmbeddableDomainType ) {
return new EmbeddedSqmPathSource<>(
name,
(EmbeddableDomainType<J>) valueDomainType,
jpaBindableType
);
}
if ( valueDomainType instanceof EntityDomainType ) {
return new EntitySqmPathSource<>(
name,
(EntityDomainType<J>) valueDomainType,
jpaBindableType
);
}
throw new IllegalArgumentException(
"Unrecognized value type Java-type [" + valueDomainType.getTypeName() + "] for plural attribute value"
);
}
public static MappingModelExpressable resolveMappingModelExpressable(
SqmTypedNode<?> sqmNode,
SqlAstCreationState creationState) {
if ( sqmNode instanceof SqmPath ) {
return resolveSqmPath( (SqmPath) sqmNode, creationState );
}
final SqmExpressable<?> nodeType = sqmNode.getNodeType();
if ( nodeType instanceof BasicType ) {
return ( (BasicType) nodeType );
}
throw new NotYetImplementedFor6Exception( DomainModelHelper.class );
}
private static ModelPart resolveSqmPath(SqmPath<?> sqmPath, SqlAstCreationState creationState) {
final DomainMetamodel domainModel = creationState.getCreationContext().getDomainModel();
if ( sqmPath instanceof SqmTreatedPath ) {
final SqmTreatedPath treatedPath = (SqmTreatedPath) sqmPath;
final EntityDomainType treatTargetType = treatedPath.getTreatTarget();
return domainModel.findEntityDescriptor( treatTargetType.getHibernateEntityName() );
}
// see if the LHS is treated
if ( sqmPath.getLhs() instanceof SqmTreatedPath ) {
final SqmTreatedPath treatedPath = (SqmTreatedPath) sqmPath.getLhs();
final EntityDomainType treatTargetType = treatedPath.getTreatTarget();
final EntityPersister container = domainModel.findEntityDescriptor( treatTargetType.getHibernateEntityName() );
return container.findSubPart( sqmPath.getNavigablePath().getLocalName(), container );
}
final TableGroup lhsTableGroup = resolveLhs( sqmPath, creationState );
lhsTableGroup.getModelPart().prepareAsLhs( sqmPath.getNavigablePath(), creationState );
return lhsTableGroup.getModelPart().findSubPart( sqmPath.getReferencedPathSource().getPathName(), null );
}
public static TableGroup resolveLhs(SqmPath<?> sqmPath, SqlAstCreationState creationState) {
final SqmPath<?> lhs = sqmPath.getLhs();
final TableGroup tableGroup = creationState.getFromClauseAccess().resolveTableGroup(
lhs.getNavigablePath(),
lhsNp -> {
assert !( lhs instanceof SqmFrom );
assert lhs.getLhs() != null;
final TableGroup lhsLhsTableGroup = resolveLhs( lhs, creationState );
final ModelPart lhsPart = lhsLhsTableGroup.getModelPart().findSubPart(
lhs.getReferencedPathSource().getPathName(),
null
);
return ( (Queryable) lhsPart ).prepareAsLhs( sqmPath.getNavigablePath(), creationState );
}
);
SqmTreeTransformationLogger.LOGGER.debugf(
"Resolved TableGroup [%s] as the left-hand side for interpretations of SqmPath [%s]",
tableGroup,
sqmPath
);
return tableGroup;
}
public static TableGroup resolveLhs(NavigablePath navigablePath, SqlAstCreationState creationState) {
assert navigablePath.getParent() != null;
final TableGroup tableGroup = creationState.getFromClauseAccess().resolveTableGroup(
navigablePath.getParent(),
lhsNp -> {
// LHS does not yet have an associated TableGroup..
final TableGroup lhsLhsTableGroup = resolveLhs( lhsNp, creationState );
final ModelPart lhsPart = lhsLhsTableGroup.getModelPart().findSubPart(
lhsNp.getLocalName(),
null
);
return ( (Queryable) lhsPart ).prepareAsLhs( navigablePath, creationState );
}
);
SqmTreeTransformationLogger.LOGGER.debugf(
"Resolved NavigablePath : [%s] -> [%s]",
navigablePath.getParent(),
tableGroup
);
return tableGroup;
}
public static TableGroup resolve(FetchParent fetchParent, DomainResultCreationState creationState) {
final SqlAstCreationState sqlAstCreationState = creationState.getSqlAstCreationState();
final FromClauseAccess fromClauseAccess = sqlAstCreationState.getFromClauseAccess();
return fromClauseAccess.resolveTableGroup(
fetchParent.getNavigablePath(),
pnp -> {
// `fetchParent` does not yet have an associated TableGroup..
assert fetchParent.getNavigablePath().getParent() != null;
final TableGroup parentParentTableGroup = resolveLhs(
fetchParent.getNavigablePath().getParent(),
sqlAstCreationState
);
return parentParentTableGroup.getModelPart().prepareAsLhs(
fetchParent.getNavigablePath(),
sqlAstCreationState
);
}
);
}
} }

View File

@ -12,6 +12,7 @@ import org.hibernate.metamodel.internal.MetadataContext;
import org.hibernate.metamodel.model.domain.ListPersistentAttribute; import org.hibernate.metamodel.model.domain.ListPersistentAttribute;
import org.hibernate.query.sqm.SqmPathSource; import org.hibernate.query.sqm.SqmPathSource;
import org.hibernate.query.hql.spi.SqmCreationState; import org.hibernate.query.hql.spi.SqmCreationState;
import org.hibernate.query.sqm.internal.SqmMappingModelHelper;
import org.hibernate.query.sqm.tree.SqmJoinType; import org.hibernate.query.sqm.tree.SqmJoinType;
import org.hibernate.query.sqm.tree.domain.SqmListJoin; import org.hibernate.query.sqm.tree.domain.SqmListJoin;
import org.hibernate.query.sqm.tree.from.SqmAttributeJoin; import org.hibernate.query.sqm.tree.from.SqmAttributeJoin;
@ -27,7 +28,7 @@ class ListAttributeImpl<X, E> extends AbstractPluralAttribute<X, List<E>, E> imp
super( builder, metadataContext ); super( builder, metadataContext );
//noinspection unchecked //noinspection unchecked
this.indexPathSource = (SqmPathSource) DomainModelHelper.resolveSqmPathSource( this.indexPathSource = (SqmPathSource) SqmMappingModelHelper.resolveSqmPathSource(
getName(), getName(),
builder.getListIndexOrMapKeyType(), builder.getListIndexOrMapKeyType(),
BindableType.PLURAL_ATTRIBUTE BindableType.PLURAL_ATTRIBUTE

View File

@ -14,6 +14,7 @@ import org.hibernate.metamodel.model.domain.MapPersistentAttribute;
import org.hibernate.metamodel.model.domain.SimpleDomainType; import org.hibernate.metamodel.model.domain.SimpleDomainType;
import org.hibernate.query.sqm.SqmPathSource; import org.hibernate.query.sqm.SqmPathSource;
import org.hibernate.query.hql.spi.SqmCreationState; import org.hibernate.query.hql.spi.SqmCreationState;
import org.hibernate.query.sqm.internal.SqmMappingModelHelper;
import org.hibernate.query.sqm.tree.SqmJoinType; import org.hibernate.query.sqm.tree.SqmJoinType;
import org.hibernate.query.sqm.tree.domain.SqmMapJoin; import org.hibernate.query.sqm.tree.domain.SqmMapJoin;
import org.hibernate.query.sqm.tree.from.SqmAttributeJoin; import org.hibernate.query.sqm.tree.from.SqmAttributeJoin;
@ -28,7 +29,7 @@ class MapAttributeImpl<X, K, V> extends AbstractPluralAttribute<X, Map<K, V>, V>
MapAttributeImpl(PluralAttributeBuilder<X, Map<K, V>, V, K> xceBuilder, MetadataContext metadataContext) { MapAttributeImpl(PluralAttributeBuilder<X, Map<K, V>, V, K> xceBuilder, MetadataContext metadataContext) {
super( xceBuilder, metadataContext ); super( xceBuilder, metadataContext );
this.keyPathSource = DomainModelHelper.resolveSqmPathSource( this.keyPathSource = SqmMappingModelHelper.resolveSqmPathSource(
getName(), getName(),
xceBuilder.getListIndexOrMapKeyType(), xceBuilder.getListIndexOrMapKeyType(),
BindableType.PLURAL_ATTRIBUTE BindableType.PLURAL_ATTRIBUTE

View File

@ -18,6 +18,7 @@ import org.hibernate.metamodel.model.domain.SimpleDomainType;
import org.hibernate.metamodel.model.domain.SingularPersistentAttribute; import org.hibernate.metamodel.model.domain.SingularPersistentAttribute;
import org.hibernate.query.sqm.SqmPathSource; import org.hibernate.query.sqm.SqmPathSource;
import org.hibernate.query.hql.spi.SqmCreationState; import org.hibernate.query.hql.spi.SqmCreationState;
import org.hibernate.query.sqm.internal.SqmMappingModelHelper;
import org.hibernate.query.sqm.tree.SqmJoinType; import org.hibernate.query.sqm.tree.SqmJoinType;
import org.hibernate.query.sqm.tree.domain.SqmPath; import org.hibernate.query.sqm.tree.domain.SqmPath;
import org.hibernate.query.sqm.tree.domain.SqmSingularJoin; import org.hibernate.query.sqm.tree.domain.SqmSingularJoin;
@ -65,7 +66,7 @@ public class SingularAttributeImpl<D,J>
this.isOptional = isOptional; this.isOptional = isOptional;
this.sqmPathSource = DomainModelHelper.resolveSqmPathSource( this.sqmPathSource = SqmMappingModelHelper.resolveSqmPathSource(
name, name,
attributeType, attributeType,
BindableType.SINGULAR_ATTRIBUTE BindableType.SINGULAR_ATTRIBUTE

View File

@ -0,0 +1,169 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
package org.hibernate.query.sqm.internal;
import javax.persistence.metamodel.Bindable;
import org.hibernate.NotYetImplementedFor6Exception;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.metamodel.mapping.MappingModelExpressable;
import org.hibernate.metamodel.mapping.ModelPart;
import org.hibernate.metamodel.mapping.Queryable;
import org.hibernate.metamodel.model.domain.AnyMappingDomainType;
import org.hibernate.metamodel.model.domain.BasicDomainType;
import org.hibernate.metamodel.model.domain.DomainType;
import org.hibernate.metamodel.model.domain.EmbeddableDomainType;
import org.hibernate.metamodel.model.domain.EntityDomainType;
import org.hibernate.metamodel.model.domain.internal.AnyMappingSqmPathSource;
import org.hibernate.metamodel.model.domain.internal.BasicSqmPathSource;
import org.hibernate.metamodel.model.domain.internal.DomainModelHelper;
import org.hibernate.metamodel.model.domain.internal.EmbeddedSqmPathSource;
import org.hibernate.metamodel.model.domain.internal.EntitySqmPathSource;
import org.hibernate.metamodel.spi.DomainMetamodel;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.query.NavigablePath;
import org.hibernate.query.sqm.SqmExpressable;
import org.hibernate.query.sqm.SqmPathSource;
import org.hibernate.query.sqm.SqmTreeTransformationLogger;
import org.hibernate.query.sqm.sql.SqlAstCreationState;
import org.hibernate.query.sqm.tree.SqmTypedNode;
import org.hibernate.query.sqm.tree.domain.SqmPath;
import org.hibernate.query.sqm.tree.domain.SqmTreatedPath;
import org.hibernate.sql.ast.tree.from.TableGroup;
import org.hibernate.type.BasicType;
/**
* Helper for dealing with Hibernate's "mapping model" while processing an SQM which is defined
* in terms of the JPA/SQM metamodel
*
* @author Steve Ebersole
*/
public class SqmMappingModelHelper {
private SqmMappingModelHelper() {
}
/**
* Resolve a JPA EntityType descriptor to it's corresponding EntityPersister
* in the Hibernate mapping type system
*/
public static EntityPersister resolveEntityPersister(
EntityDomainType<?> entityType,
SessionFactoryImplementor sessionFactory) {
// Our EntityTypeImpl#getType impl returns the Hibernate entity-name
// which is exactly what we want
final String hibernateEntityName = entityType.getHibernateEntityName();
return sessionFactory.getMetamodel().entityPersister( hibernateEntityName );
}
public static <J> SqmPathSource<J> resolveSqmPathSource(
String name,
DomainType<J> valueDomainType,
Bindable.BindableType jpaBindableType) {
if ( valueDomainType instanceof BasicDomainType ) {
return new BasicSqmPathSource<>(
name,
(BasicDomainType<J>) valueDomainType,
jpaBindableType
);
}
if ( valueDomainType instanceof AnyMappingDomainType ) {
return new AnyMappingSqmPathSource<>(
name,
(AnyMappingDomainType<J>) valueDomainType,
jpaBindableType
);
}
if ( valueDomainType instanceof EmbeddableDomainType ) {
return new EmbeddedSqmPathSource<>(
name,
(EmbeddableDomainType<J>) valueDomainType,
jpaBindableType
);
}
if ( valueDomainType instanceof EntityDomainType ) {
return new EntitySqmPathSource<>(
name,
(EntityDomainType<J>) valueDomainType,
jpaBindableType
);
}
throw new IllegalArgumentException(
"Unrecognized value type Java-type [" + valueDomainType.getTypeName() + "] for plural attribute value"
);
}
public static MappingModelExpressable resolveMappingModelExpressable(
SqmTypedNode<?> sqmNode,
SqlAstCreationState creationState) {
if ( sqmNode instanceof SqmPath ) {
return resolveSqmPath( (SqmPath) sqmNode, creationState );
}
final SqmExpressable<?> nodeType = sqmNode.getNodeType();
if ( nodeType instanceof BasicType ) {
return ( (BasicType) nodeType );
}
throw new NotYetImplementedFor6Exception( DomainModelHelper.class );
}
private static ModelPart resolveSqmPath(SqmPath<?> sqmPath, SqlAstCreationState creationState) {
final DomainMetamodel domainModel = creationState.getCreationContext().getDomainModel();
if ( sqmPath instanceof SqmTreatedPath ) {
final SqmTreatedPath treatedPath = (SqmTreatedPath) sqmPath;
final EntityDomainType treatTargetType = treatedPath.getTreatTarget();
return domainModel.findEntityDescriptor( treatTargetType.getHibernateEntityName() );
}
// see if the LHS is treated
if ( sqmPath.getLhs() instanceof SqmTreatedPath ) {
final SqmTreatedPath treatedPath = (SqmTreatedPath) sqmPath.getLhs();
final EntityDomainType treatTargetType = treatedPath.getTreatTarget();
final EntityPersister container = domainModel.findEntityDescriptor( treatTargetType.getHibernateEntityName() );
return container.findSubPart( sqmPath.getNavigablePath().getLocalName(), container );
}
final TableGroup lhsTableGroup = resolveLhs( sqmPath.getNavigablePath(), creationState );
lhsTableGroup.getModelPart().prepareAsLhs( sqmPath.getNavigablePath(), creationState );
return lhsTableGroup.getModelPart().findSubPart( sqmPath.getReferencedPathSource().getPathName(), null );
}
public static TableGroup resolveLhs(NavigablePath navigablePath, SqlAstCreationState creationState) {
assert navigablePath.getParent() != null;
final TableGroup tableGroup = creationState.getFromClauseAccess().resolveTableGroup(
navigablePath.getParent(),
lhsNp -> {
// LHS does not yet have an associated TableGroup..
final TableGroup lhsLhsTableGroup = resolveLhs( lhsNp, creationState );
final ModelPart lhsPart = lhsLhsTableGroup.getModelPart().findSubPart(
lhsNp.getLocalName(),
null
);
return ( (Queryable) lhsPart ).prepareAsLhs( navigablePath, creationState );
}
);
SqmTreeTransformationLogger.LOGGER.debugf(
"Resolved NavigablePath : [%s] -> [%s]",
navigablePath.getParent(),
tableGroup
);
return tableGroup;
}
}

View File

@ -10,14 +10,13 @@ import java.util.function.Consumer;
import org.hibernate.NotYetImplementedFor6Exception; import org.hibernate.NotYetImplementedFor6Exception;
import org.hibernate.metamodel.mapping.BasicValuedModelPart; import org.hibernate.metamodel.mapping.BasicValuedModelPart;
import org.hibernate.metamodel.model.domain.internal.DomainModelHelper;
import org.hibernate.query.NavigablePath; import org.hibernate.query.NavigablePath;
import org.hibernate.query.sqm.SemanticQueryWalker; import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.SqmPathSource; import org.hibernate.query.sqm.SqmPathSource;
import org.hibernate.query.sqm.internal.SqmMappingModelHelper;
import org.hibernate.query.sqm.sql.SqlAstCreationState; import org.hibernate.query.sqm.sql.SqlAstCreationState;
import org.hibernate.query.sqm.sql.SqmToSqlAstConverter; import org.hibernate.query.sqm.sql.SqmToSqlAstConverter;
import org.hibernate.query.sqm.tree.domain.SqmBasicValuedSimplePath; import org.hibernate.query.sqm.tree.domain.SqmBasicValuedSimplePath;
import org.hibernate.query.sqm.tree.domain.SqmPath;
import org.hibernate.sql.ast.Clause; import org.hibernate.sql.ast.Clause;
import org.hibernate.sql.ast.spi.SqlAstCreationContext; import org.hibernate.sql.ast.spi.SqlAstCreationContext;
import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.expression.Expression;
@ -37,7 +36,7 @@ public class BasicValuedPathInterpretation<T> implements AssignableSqmPathInterp
SqmBasicValuedSimplePath<T> sqmPath, SqmBasicValuedSimplePath<T> sqmPath,
SqlAstCreationState sqlAstCreationState, SqlAstCreationState sqlAstCreationState,
SemanticQueryWalker sqmWalker) { SemanticQueryWalker sqmWalker) {
final TableGroup tableGroup = DomainModelHelper.resolveLhs( sqmPath, sqlAstCreationState ); final TableGroup tableGroup = SqmMappingModelHelper.resolveLhs( sqmPath.getNavigablePath(), sqlAstCreationState );
tableGroup.getModelPart().prepareAsLhs( sqmPath.getNavigablePath(), sqlAstCreationState ); tableGroup.getModelPart().prepareAsLhs( sqmPath.getNavigablePath(), sqlAstCreationState );
final BasicValuedModelPart mapping = (BasicValuedModelPart) tableGroup.getModelPart().findSubPart( final BasicValuedModelPart mapping = (BasicValuedModelPart) tableGroup.getModelPart().findSubPart(

View File

@ -10,14 +10,13 @@ import java.util.function.Consumer;
import org.hibernate.NotYetImplementedFor6Exception; import org.hibernate.NotYetImplementedFor6Exception;
import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart; import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart;
import org.hibernate.metamodel.model.domain.internal.DomainModelHelper;
import org.hibernate.query.NavigablePath; import org.hibernate.query.NavigablePath;
import org.hibernate.query.sqm.SemanticQueryWalker; import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.SqmPathSource; import org.hibernate.query.sqm.SqmPathSource;
import org.hibernate.query.sqm.internal.SqmMappingModelHelper;
import org.hibernate.query.sqm.sql.SqlAstCreationState; import org.hibernate.query.sqm.sql.SqlAstCreationState;
import org.hibernate.query.sqm.sql.SqmToSqlAstConverter; import org.hibernate.query.sqm.sql.SqmToSqlAstConverter;
import org.hibernate.query.sqm.tree.domain.SqmEmbeddedValuedSimplePath; import org.hibernate.query.sqm.tree.domain.SqmEmbeddedValuedSimplePath;
import org.hibernate.query.sqm.tree.domain.SqmPath;
import org.hibernate.sql.ast.Clause; import org.hibernate.sql.ast.Clause;
import org.hibernate.sql.ast.spi.SqlAstCreationContext; import org.hibernate.sql.ast.spi.SqlAstCreationContext;
import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.expression.Expression;
@ -38,7 +37,7 @@ public class EmbeddableValuedPathInterpretation<T> implements AssignableSqmPathI
SqmEmbeddedValuedSimplePath<T> sqmPath, SqmEmbeddedValuedSimplePath<T> sqmPath,
SqlAstCreationState sqlAstCreationState, SqlAstCreationState sqlAstCreationState,
SemanticQueryWalker sqmWalker) { SemanticQueryWalker sqmWalker) {
final TableGroup tableGroup = DomainModelHelper.resolveLhs( sqmPath, sqlAstCreationState ); final TableGroup tableGroup = SqmMappingModelHelper.resolveLhs( sqmPath.getNavigablePath(), sqlAstCreationState );
tableGroup.getModelPart().prepareAsLhs( sqmPath.getNavigablePath(), sqlAstCreationState ); tableGroup.getModelPart().prepareAsLhs( sqmPath.getNavigablePath(), sqlAstCreationState );
final EmbeddableValuedModelPart mapping = (EmbeddableValuedModelPart) tableGroup.getModelPart().findSubPart( final EmbeddableValuedModelPart mapping = (EmbeddableValuedModelPart) tableGroup.getModelPart().findSubPart(

View File

@ -6,10 +6,10 @@
*/ */
package org.hibernate.query.sqm.tree.expression; package org.hibernate.query.sqm.tree.expression;
import org.hibernate.metamodel.model.domain.internal.DomainModelHelper;
import org.hibernate.query.sqm.NodeBuilder; import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.sqm.SemanticQueryWalker; import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.SqmExpressable; import org.hibernate.query.sqm.SqmExpressable;
import org.hibernate.query.sqm.internal.SqmMappingModelHelper;
import org.hibernate.query.sqm.sql.SqlAstCreationState; import org.hibernate.query.sqm.sql.SqlAstCreationState;
import org.hibernate.query.sqm.sql.SqmToSqlAstConverter; import org.hibernate.query.sqm.sql.SqmToSqlAstConverter;
import org.hibernate.query.sqm.sql.internal.DomainResultProducer; import org.hibernate.query.sqm.sql.internal.DomainResultProducer;
@ -53,7 +53,7 @@ public class SqmLiteral<T>
SqlAstCreationState sqlAstCreationState) { SqlAstCreationState sqlAstCreationState) {
return new QueryLiteral( return new QueryLiteral(
getLiteralValue(), getLiteralValue(),
DomainModelHelper.resolveMappingModelExpressable( this, sqlAstCreationState ), SqmMappingModelHelper.resolveMappingModelExpressable( this, sqlAstCreationState ),
clause clause
); );
} }