Disable select item deduplication for query groups and deduplicate within a fetch parent

This commit is contained in:
Christian Beikov 2022-03-22 16:05:08 +01:00
parent b4a1b149fb
commit 23098ca254
58 changed files with 224 additions and 79 deletions

View File

@ -19,6 +19,7 @@ import org.hibernate.sql.ast.tree.from.TableReference;
import org.hibernate.sql.ast.tree.predicate.Predicate; import org.hibernate.sql.ast.tree.predicate.Predicate;
import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.DomainResultCreationState;
import org.hibernate.sql.results.graph.FetchParent;
/** /**
* Descriptor for foreign-keys * Descriptor for foreign-keys
@ -81,7 +82,7 @@ public interface ForeignKeyDescriptor extends VirtualModelPart, ValueMapping {
DomainResult<?> createKeyDomainResult( DomainResult<?> createKeyDomainResult(
NavigablePath navigablePath, NavigablePath navigablePath,
TableGroup tableGroup, TableGroup tableGroup,
DomainResultCreationState creationState); FetchParent fetchParent, DomainResultCreationState creationState);
/** /**
* Create a DomainResult for the target-side of the fk * Create a DomainResult for the target-side of the fk
@ -89,18 +90,13 @@ public interface ForeignKeyDescriptor extends VirtualModelPart, ValueMapping {
DomainResult<?> createTargetDomainResult( DomainResult<?> createTargetDomainResult(
NavigablePath navigablePath, NavigablePath navigablePath,
TableGroup tableGroup, TableGroup tableGroup,
DomainResultCreationState creationState); FetchParent fetchParent, DomainResultCreationState creationState);
DomainResult<?> createCollectionFetchDomainResult(
NavigablePath collectionPath,
TableGroup tableGroup,
DomainResultCreationState creationState);
DomainResult<?> createDomainResult( DomainResult<?> createDomainResult(
NavigablePath navigablePath, NavigablePath navigablePath,
TableGroup tableGroup, TableGroup tableGroup,
Nature side, Nature side,
DomainResultCreationState creationState); FetchParent fetchParent, DomainResultCreationState creationState);
Predicate generateJoinPredicate( Predicate generateJoinPredicate(
TableGroup targetSideTableGroup, TableGroup targetSideTableGroup,

View File

@ -130,7 +130,13 @@ public abstract class AbstractDiscriminatorMapping implements EntityDiscriminato
TableGroup tableGroup, TableGroup tableGroup,
String resultVariable, String resultVariable,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
final SqlSelection sqlSelection = resolveSqlSelection( navigablePath, getUnderlyingJdbcMappingType(), tableGroup, creationState.getSqlAstCreationState() ); final SqlSelection sqlSelection = resolveSqlSelection(
navigablePath,
getUnderlyingJdbcMappingType(),
tableGroup,
null,
creationState.getSqlAstCreationState()
);
//noinspection unchecked //noinspection unchecked
return new BasicResult( return new BasicResult(
@ -146,11 +152,13 @@ public abstract class AbstractDiscriminatorMapping implements EntityDiscriminato
NavigablePath navigablePath, NavigablePath navigablePath,
JdbcMapping jdbcMappingToUse, JdbcMapping jdbcMappingToUse,
TableGroup tableGroup, TableGroup tableGroup,
FetchParent fetchParent,
SqlAstCreationState creationState) { SqlAstCreationState creationState) {
final SqlExpressionResolver expressionResolver = creationState.getSqlExpressionResolver(); final SqlExpressionResolver expressionResolver = creationState.getSqlExpressionResolver();
return expressionResolver.resolveSqlSelection( return expressionResolver.resolveSqlSelection(
resolveSqlExpression( navigablePath, jdbcMappingToUse, tableGroup, creationState ), resolveSqlExpression( navigablePath, jdbcMappingToUse, tableGroup, creationState ),
jdbcMappingToUse.getJavaTypeDescriptor(), jdbcMappingToUse.getJavaTypeDescriptor(),
fetchParent,
creationState.getCreationContext().getSessionFactory().getTypeConfiguration() creationState.getCreationContext().getSessionFactory().getTypeConfiguration()
); );
} }
@ -170,7 +178,13 @@ public abstract class AbstractDiscriminatorMapping implements EntityDiscriminato
assert tableGroup != null; assert tableGroup != null;
final SqlSelection sqlSelection = resolveSqlSelection( fetchablePath, getUnderlyingJdbcMappingType(), tableGroup, creationState.getSqlAstCreationState() ); final SqlSelection sqlSelection = resolveSqlSelection(
fetchablePath,
getUnderlyingJdbcMappingType(),
tableGroup,
fetchParent,
creationState.getSqlAstCreationState()
);
return new BasicFetch<>( return new BasicFetch<>(
sqlSelection.getValuesArrayPosition(), sqlSelection.getValuesArrayPosition(),
@ -188,7 +202,7 @@ public abstract class AbstractDiscriminatorMapping implements EntityDiscriminato
NavigablePath navigablePath, NavigablePath navigablePath,
TableGroup tableGroup, TableGroup tableGroup,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
resolveSqlSelection( navigablePath, getUnderlyingJdbcMappingType(), tableGroup, creationState.getSqlAstCreationState() ); resolveSqlSelection( navigablePath, getUnderlyingJdbcMappingType(), tableGroup, null, creationState.getSqlAstCreationState() );
} }
@Override @Override
@ -198,7 +212,7 @@ public abstract class AbstractDiscriminatorMapping implements EntityDiscriminato
DomainResultCreationState creationState, DomainResultCreationState creationState,
BiConsumer<SqlSelection, JdbcMapping> selectionConsumer) { BiConsumer<SqlSelection, JdbcMapping> selectionConsumer) {
selectionConsumer.accept( selectionConsumer.accept(
resolveSqlSelection( navigablePath, getUnderlyingJdbcMappingType(), tableGroup, creationState.getSqlAstCreationState() ), resolveSqlSelection( navigablePath, getUnderlyingJdbcMappingType(), tableGroup, null, creationState.getSqlAstCreationState() ),
getJdbcMapping() getJdbcMapping()
); );
} }

View File

@ -274,6 +274,7 @@ public class AnyDiscriminatorPart implements BasicValuedModelPart, FetchOptions,
final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection( final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection(
columnReference, columnReference,
jdbcMapping().getMappedJavaType(), jdbcMapping().getMappedJavaType(),
fetchParent,
sessionFactory.getTypeConfiguration() sessionFactory.getTypeConfiguration()
); );

View File

@ -199,6 +199,7 @@ public class AnyKeyPart implements BasicValuedModelPart, FetchOptions {
final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection( final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection(
columnReference, columnReference,
getJavaType(), getJavaType(),
fetchParent,
sessionFactory.getTypeConfiguration() sessionFactory.getTypeConfiguration()
); );

View File

@ -254,7 +254,7 @@ public class BasicAttributeMapping
TableGroup tableGroup, TableGroup tableGroup,
String resultVariable, String resultVariable,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
final SqlSelection sqlSelection = resolveSqlSelection( navigablePath, tableGroup, true, creationState ); final SqlSelection sqlSelection = resolveSqlSelection( navigablePath, tableGroup, true, null, creationState );
//noinspection unchecked //noinspection unchecked
return new BasicResult( return new BasicResult(
@ -270,6 +270,7 @@ public class BasicAttributeMapping
NavigablePath navigablePath, NavigablePath navigablePath,
TableGroup tableGroup, TableGroup tableGroup,
boolean allowFkOptimization, boolean allowFkOptimization,
FetchParent fetchParent,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
final SqlExpressionResolver expressionResolver = creationState.getSqlAstCreationState().getSqlExpressionResolver(); final SqlExpressionResolver expressionResolver = creationState.getSqlAstCreationState().getSqlExpressionResolver();
final TableReference tableReference = tableGroup.resolveTableReference( final TableReference tableReference = tableGroup.resolveTableReference(
@ -291,6 +292,7 @@ public class BasicAttributeMapping
) )
), ),
valueConverter == null ? getMappedType().getMappedJavaType() : valueConverter.getRelationalJavaType(), valueConverter == null ? getMappedType().getMappedJavaType() : valueConverter.getRelationalJavaType(),
fetchParent,
creationState.getSqlAstCreationState().getCreationContext().getSessionFactory().getTypeConfiguration() creationState.getSqlAstCreationState().getCreationContext().getSessionFactory().getTypeConfiguration()
); );
} }
@ -300,7 +302,7 @@ public class BasicAttributeMapping
NavigablePath navigablePath, NavigablePath navigablePath,
TableGroup tableGroup, TableGroup tableGroup,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
resolveSqlSelection( navigablePath, tableGroup, true, creationState ); resolveSqlSelection( navigablePath, tableGroup, true, null, creationState );
} }
@Override @Override
@ -309,7 +311,7 @@ public class BasicAttributeMapping
TableGroup tableGroup, TableGroup tableGroup,
DomainResultCreationState creationState, DomainResultCreationState creationState,
BiConsumer<SqlSelection, JdbcMapping> selectionConsumer) { BiConsumer<SqlSelection, JdbcMapping> selectionConsumer) {
selectionConsumer.accept( resolveSqlSelection( navigablePath, tableGroup, true, creationState ), getJdbcMapping() ); selectionConsumer.accept( resolveSqlSelection( navigablePath, tableGroup, true, null, creationState ), getJdbcMapping() );
} }
@Override @Override
@ -336,7 +338,7 @@ public class BasicAttributeMapping
assert tableGroup != null; assert tableGroup != null;
final SqlSelection sqlSelection = resolveSqlSelection( fetchablePath, tableGroup, true, creationState ); final SqlSelection sqlSelection = resolveSqlSelection( fetchablePath, tableGroup, true, fetchParent, creationState );
valuesArrayPosition = sqlSelection.getValuesArrayPosition(); valuesArrayPosition = sqlSelection.getValuesArrayPosition();
} }

View File

@ -215,7 +215,7 @@ public class BasicEntityIdentifierMappingImpl implements BasicEntityIdentifierMa
TableGroup tableGroup, TableGroup tableGroup,
String resultVariable, String resultVariable,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
final SqlSelection sqlSelection = resolveSqlSelection( navigablePath, tableGroup, true, creationState ); final SqlSelection sqlSelection = resolveSqlSelection( navigablePath, tableGroup, true, null, creationState );
return new BasicResult( return new BasicResult(
sqlSelection.getValuesArrayPosition(), sqlSelection.getValuesArrayPosition(),
@ -230,7 +230,7 @@ public class BasicEntityIdentifierMappingImpl implements BasicEntityIdentifierMa
NavigablePath navigablePath, NavigablePath navigablePath,
TableGroup tableGroup, TableGroup tableGroup,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
resolveSqlSelection( navigablePath, tableGroup, true, creationState ); resolveSqlSelection( navigablePath, tableGroup, true, null, creationState );
} }
@Override @Override
@ -240,7 +240,7 @@ public class BasicEntityIdentifierMappingImpl implements BasicEntityIdentifierMa
DomainResultCreationState creationState, DomainResultCreationState creationState,
BiConsumer<SqlSelection, JdbcMapping> selectionConsumer) { BiConsumer<SqlSelection, JdbcMapping> selectionConsumer) {
selectionConsumer.accept( selectionConsumer.accept(
resolveSqlSelection( navigablePath, tableGroup, true, creationState ), resolveSqlSelection( navigablePath, tableGroup, true, null, creationState ),
getJdbcMapping() getJdbcMapping()
); );
} }
@ -249,6 +249,7 @@ public class BasicEntityIdentifierMappingImpl implements BasicEntityIdentifierMa
NavigablePath navigablePath, NavigablePath navigablePath,
TableGroup tableGroup, TableGroup tableGroup,
boolean allowFkOptimization, boolean allowFkOptimization,
FetchParent fetchParent,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
final SqlExpressionResolver expressionResolver = creationState.getSqlAstCreationState() final SqlExpressionResolver expressionResolver = creationState.getSqlAstCreationState()
.getSqlExpressionResolver(); .getSqlExpressionResolver();
@ -285,6 +286,7 @@ public class BasicEntityIdentifierMappingImpl implements BasicEntityIdentifierMa
return expressionResolver.resolveSqlSelection( return expressionResolver.resolveSqlSelection(
expression, expression,
idType.getExpressibleJavaType(), idType.getExpressibleJavaType(),
fetchParent,
sessionFactory.getTypeConfiguration() sessionFactory.getTypeConfiguration()
); );
} }
@ -383,7 +385,7 @@ public class BasicEntityIdentifierMappingImpl implements BasicEntityIdentifierMa
assert tableGroup != null; assert tableGroup != null;
final SqlSelection sqlSelection = resolveSqlSelection( fetchablePath, tableGroup, false, creationState ); final SqlSelection sqlSelection = resolveSqlSelection( fetchablePath, tableGroup, false, fetchParent, creationState );
return new BasicFetch<>( return new BasicFetch<>(
sqlSelection.getValuesArrayPosition(), sqlSelection.getValuesArrayPosition(),
fetchParent, fetchParent,

View File

@ -151,7 +151,7 @@ public class BasicValuedCollectionPart
TableGroup tableGroup, TableGroup tableGroup,
String resultVariable, String resultVariable,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
final SqlSelection sqlSelection = resolveSqlSelection( navigablePath, tableGroup, true, creationState ); final SqlSelection sqlSelection = resolveSqlSelection( navigablePath, tableGroup, true, null, creationState );
//noinspection unchecked //noinspection unchecked
return new BasicResult( return new BasicResult(
@ -167,6 +167,7 @@ public class BasicValuedCollectionPart
NavigablePath navigablePath, NavigablePath navigablePath,
TableGroup tableGroup, TableGroup tableGroup,
boolean allowFkOptimization, boolean allowFkOptimization,
FetchParent fetchParent,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
final SqlExpressionResolver exprResolver = creationState.getSqlAstCreationState().getSqlExpressionResolver(); final SqlExpressionResolver exprResolver = creationState.getSqlAstCreationState().getSqlExpressionResolver();
final TableGroup targetTableGroup; final TableGroup targetTableGroup;
@ -197,6 +198,7 @@ public class BasicValuedCollectionPart
) )
), ),
getJavaType(), getJavaType(),
fetchParent,
creationState.getSqlAstCreationState().getCreationContext().getSessionFactory().getTypeConfiguration() creationState.getSqlAstCreationState().getCreationContext().getSessionFactory().getTypeConfiguration()
); );
} }
@ -204,7 +206,7 @@ public class BasicValuedCollectionPart
@Override @Override
public void applySqlSelections( public void applySqlSelections(
NavigablePath navigablePath, TableGroup tableGroup, DomainResultCreationState creationState) { NavigablePath navigablePath, TableGroup tableGroup, DomainResultCreationState creationState) {
resolveSqlSelection( navigablePath, tableGroup, true, creationState ); resolveSqlSelection( navigablePath, tableGroup, true, null, creationState );
} }
@Override @Override
@ -213,7 +215,7 @@ public class BasicValuedCollectionPart
TableGroup tableGroup, TableGroup tableGroup,
DomainResultCreationState creationState, DomainResultCreationState creationState,
BiConsumer<SqlSelection, JdbcMapping> selectionConsumer) { BiConsumer<SqlSelection, JdbcMapping> selectionConsumer) {
selectionConsumer.accept( resolveSqlSelection( navigablePath, tableGroup, true, creationState ), getJdbcMapping() ); selectionConsumer.accept( resolveSqlSelection( navigablePath, tableGroup, true, null, creationState ), getJdbcMapping() );
} }
@Override @Override
@ -263,7 +265,7 @@ public class BasicValuedCollectionPart
final TableGroup tableGroup = creationState.getSqlAstCreationState() final TableGroup tableGroup = creationState.getSqlAstCreationState()
.getFromClauseAccess() .getFromClauseAccess()
.findTableGroup( parentNavigablePath ); .findTableGroup( parentNavigablePath );
final SqlSelection sqlSelection = resolveSqlSelection( fetchablePath, tableGroup, true, creationState ); final SqlSelection sqlSelection = resolveSqlSelection( fetchablePath, tableGroup, true, fetchParent, creationState );
return new BasicFetch<>( return new BasicFetch<>(
sqlSelection.getValuesArrayPosition(), sqlSelection.getValuesArrayPosition(),

View File

@ -231,6 +231,7 @@ public class CollectionIdentifierDescriptorImpl implements CollectionIdentifierD
) )
), ),
type.getJavaTypeDescriptor(), type.getJavaTypeDescriptor(),
fetchParent,
sessionFactory.getTypeConfiguration() sessionFactory.getTypeConfiguration()
); );
@ -271,6 +272,7 @@ public class CollectionIdentifierDescriptorImpl implements CollectionIdentifierD
) )
), ),
type.getJavaTypeDescriptor(), type.getJavaTypeDescriptor(),
null,
sessionFactory.getTypeConfiguration() sessionFactory.getTypeConfiguration()
); );

View File

@ -45,6 +45,7 @@ import org.hibernate.sql.ast.tree.predicate.Junction;
import org.hibernate.sql.ast.tree.predicate.Predicate; import org.hibernate.sql.ast.tree.predicate.Predicate;
import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.DomainResultCreationState;
import org.hibernate.sql.results.graph.FetchParent;
import org.hibernate.sql.results.graph.embeddable.internal.EmbeddableForeignKeyResultImpl; import org.hibernate.sql.results.graph.embeddable.internal.EmbeddableForeignKeyResultImpl;
import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.descriptor.java.JavaType;
@ -187,6 +188,7 @@ public class EmbeddedForeignKeyDescriptor implements ForeignKeyDescriptor {
public DomainResult<?> createKeyDomainResult( public DomainResult<?> createKeyDomainResult(
NavigablePath navigablePath, NavigablePath navigablePath,
TableGroup tableGroup, TableGroup tableGroup,
FetchParent fetchParent,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
return createDomainResult( return createDomainResult(
navigablePath, navigablePath,
@ -194,6 +196,7 @@ public class EmbeddedForeignKeyDescriptor implements ForeignKeyDescriptor {
null, null,
keyTable, keyTable,
keySide.getModelPart(), keySide.getModelPart(),
fetchParent,
creationState creationState
); );
} }
@ -202,6 +205,7 @@ public class EmbeddedForeignKeyDescriptor implements ForeignKeyDescriptor {
public DomainResult<?> createTargetDomainResult( public DomainResult<?> createTargetDomainResult(
NavigablePath navigablePath, NavigablePath navigablePath,
TableGroup tableGroup, TableGroup tableGroup,
FetchParent fetchParent,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
assert tableGroup.getTableReference( navigablePath, targetTable ) != null; assert tableGroup.getTableReference( navigablePath, targetTable ) != null;
@ -211,42 +215,17 @@ public class EmbeddedForeignKeyDescriptor implements ForeignKeyDescriptor {
null, null,
targetTable, targetTable,
targetSide.getModelPart(), targetSide.getModelPart(),
fetchParent,
creationState creationState
); );
} }
@Override
public DomainResult<?> createCollectionFetchDomainResult(
NavigablePath collectionPath,
TableGroup tableGroup,
DomainResultCreationState creationState) {
if ( targetTable.equals( keyTable ) ) {
return createDomainResult(
collectionPath,
tableGroup,
null,
targetTable,
targetSide.getModelPart(),
creationState
);
}
else {
return createDomainResult(
collectionPath,
tableGroup,
null,
keyTable,
keySide.getModelPart(),
creationState
);
}
}
@Override @Override
public DomainResult<?> createDomainResult( public DomainResult<?> createDomainResult(
NavigablePath navigablePath, NavigablePath navigablePath,
TableGroup tableGroup, TableGroup tableGroup,
Nature side, Nature side,
FetchParent fetchParent,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
if ( side == Nature.KEY ) { if ( side == Nature.KEY ) {
return createDomainResult( return createDomainResult(
@ -255,6 +234,7 @@ public class EmbeddedForeignKeyDescriptor implements ForeignKeyDescriptor {
null, null,
keyTable, keyTable,
keySide.getModelPart(), keySide.getModelPart(),
fetchParent,
creationState creationState
); );
} }
@ -265,6 +245,7 @@ public class EmbeddedForeignKeyDescriptor implements ForeignKeyDescriptor {
null, null,
targetTable, targetTable,
targetSide.getModelPart(), targetSide.getModelPart(),
fetchParent,
creationState creationState
); );
} }
@ -276,7 +257,15 @@ public class EmbeddedForeignKeyDescriptor implements ForeignKeyDescriptor {
TableGroup tableGroup, TableGroup tableGroup,
String resultVariable, String resultVariable,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
return createDomainResult( navigablePath, tableGroup, resultVariable, keyTable, keySide.getModelPart(), creationState ); return createDomainResult(
navigablePath,
tableGroup,
resultVariable,
keyTable,
keySide.getModelPart(),
null,
creationState
);
} }
@Override @Override
@ -302,6 +291,7 @@ public class EmbeddedForeignKeyDescriptor implements ForeignKeyDescriptor {
String resultVariable, String resultVariable,
String columnContainingTable, String columnContainingTable,
EmbeddableValuedModelPart modelPart, EmbeddableValuedModelPart modelPart,
FetchParent fetchParent,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
final NavigablePath resultNavigablePath; final NavigablePath resultNavigablePath;
if ( modelPart == keySide.getModelPart() ) { if ( modelPart == keySide.getModelPart() ) {
@ -334,6 +324,7 @@ public class EmbeddedForeignKeyDescriptor implements ForeignKeyDescriptor {
resultNavigablePath, resultNavigablePath,
modelPart, modelPart,
resultVariable, resultVariable,
fetchParent,
creationState creationState
); );
} }

View File

@ -106,6 +106,7 @@ public class EntityRowIdMappingImpl implements EntityRowIdMapping, SelectableMap
) )
), ),
rowIdType.getJavaTypeDescriptor(), rowIdType.getJavaTypeDescriptor(),
null,
sqlAstCreationState.getCreationContext().getSessionFactory().getTypeConfiguration() sqlAstCreationState.getCreationContext().getSessionFactory().getTypeConfiguration()
); );

View File

@ -38,7 +38,6 @@ import org.hibernate.sql.results.graph.FetchParent;
import org.hibernate.sql.results.graph.basic.BasicFetch; import org.hibernate.sql.results.graph.basic.BasicFetch;
import org.hibernate.sql.results.graph.basic.BasicResult; import org.hibernate.sql.results.graph.basic.BasicResult;
import org.hibernate.type.BasicType; import org.hibernate.type.BasicType;
import org.hibernate.type.descriptor.java.JavaType;
import org.hibernate.type.descriptor.java.VersionJavaType; import org.hibernate.type.descriptor.java.VersionJavaType;
/** /**
@ -228,6 +227,7 @@ public class EntityVersionMappingImpl implements EntityVersionMapping, FetchOpti
) )
), ),
versionBasicType.getJdbcMapping().getJavaTypeDescriptor(), versionBasicType.getJdbcMapping().getJavaTypeDescriptor(),
fetchParent,
sqlAstCreationState.getCreationContext().getSessionFactory().getTypeConfiguration() sqlAstCreationState.getCreationContext().getSessionFactory().getTypeConfiguration()
); );
@ -302,6 +302,7 @@ public class EntityVersionMappingImpl implements EntityVersionMapping, FetchOpti
) )
), ),
versionBasicType.getJdbcMapping().getJavaTypeDescriptor(), versionBasicType.getJdbcMapping().getJavaTypeDescriptor(),
null,
sqlAstCreationState.getCreationContext().getSessionFactory().getTypeConfiguration() sqlAstCreationState.getCreationContext().getSessionFactory().getTypeConfiguration()
); );
} }

View File

@ -466,6 +466,7 @@ public class PluralAttributeMappingImpl
final DomainResult<?> collectionKeyDomainResult = getKeyDescriptor().createTargetDomainResult( final DomainResult<?> collectionKeyDomainResult = getKeyDescriptor().createTargetDomainResult(
fetchablePath, fetchablePath,
sqlAstCreationState.getFromClauseAccess().getTableGroup( fetchParent.getNavigablePath() ), sqlAstCreationState.getFromClauseAccess().getTableGroup( fetchParent.getNavigablePath() ),
fetchParent,
creationState creationState
); );
@ -517,6 +518,7 @@ public class PluralAttributeMappingImpl
collectionKeyDomainResult = getKeyDescriptor().createTargetDomainResult( collectionKeyDomainResult = getKeyDescriptor().createTargetDomainResult(
fetchablePath, fetchablePath,
sqlAstCreationState.getFromClauseAccess().getTableGroup( fetchParent.getNavigablePath() ), sqlAstCreationState.getFromClauseAccess().getTableGroup( fetchParent.getNavigablePath() ),
fetchParent,
creationState creationState
); );
} }

View File

@ -157,44 +157,43 @@ public class SimpleForeignKeyDescriptor implements ForeignKeyDescriptor, BasicVa
public DomainResult<?> createKeyDomainResult( public DomainResult<?> createKeyDomainResult(
NavigablePath navigablePath, NavigablePath navigablePath,
TableGroup tableGroup, TableGroup tableGroup,
FetchParent fetchParent,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
return createDomainResult( return createDomainResult(
navigablePath, navigablePath,
tableGroup, tableGroup,
keySide.getModelPart(), keySide.getModelPart(),
fetchParent,
creationState creationState
); );
} }
@Override @Override
public DomainResult<?> createTargetDomainResult(NavigablePath navigablePath, TableGroup tableGroup, DomainResultCreationState creationState) { public DomainResult<?> createTargetDomainResult(
NavigablePath navigablePath,
TableGroup tableGroup,
FetchParent fetchParent,
DomainResultCreationState creationState) {
return createDomainResult( return createDomainResult(
navigablePath, navigablePath,
tableGroup, tableGroup,
targetSide.getModelPart(), targetSide.getModelPart(),
fetchParent,
creationState creationState
); );
} }
@Override
public DomainResult<?> createCollectionFetchDomainResult(
NavigablePath collectionPath,
TableGroup tableGroup,
DomainResultCreationState creationState) {
return createDomainResult( collectionPath, tableGroup, targetSide.getModelPart(), creationState );
}
@Override @Override
public DomainResult<?> createDomainResult( public DomainResult<?> createDomainResult(
NavigablePath navigablePath, NavigablePath navigablePath,
TableGroup tableGroup, TableGroup tableGroup,
Nature side, Nature side,
DomainResultCreationState creationState) { FetchParent fetchParent, DomainResultCreationState creationState) {
if ( side == Nature.KEY ) { if ( side == Nature.KEY ) {
return createDomainResult( navigablePath, tableGroup, keySide.getModelPart(), creationState ); return createDomainResult( navigablePath, tableGroup, keySide.getModelPart(), fetchParent, creationState );
} }
else { else {
return createDomainResult( navigablePath, tableGroup, targetSide.getModelPart(), creationState ); return createDomainResult( navigablePath, tableGroup, targetSide.getModelPart(), fetchParent, creationState );
} }
} }
@ -204,7 +203,7 @@ public class SimpleForeignKeyDescriptor implements ForeignKeyDescriptor, BasicVa
TableGroup tableGroup, TableGroup tableGroup,
String resultVariable, String resultVariable,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
return createDomainResult( navigablePath, tableGroup, keySide.getModelPart(), creationState ); return createDomainResult( navigablePath, tableGroup, keySide.getModelPart(), null, creationState );
} }
@Override @Override
@ -228,6 +227,7 @@ public class SimpleForeignKeyDescriptor implements ForeignKeyDescriptor, BasicVa
NavigablePath navigablePath, NavigablePath navigablePath,
TableGroup tableGroup, TableGroup tableGroup,
SelectableMapping selectableMapping, SelectableMapping selectableMapping,
FetchParent fetchParent,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
final SqlAstCreationState sqlAstCreationState = creationState.getSqlAstCreationState(); final SqlAstCreationState sqlAstCreationState = creationState.getSqlAstCreationState();
final SqlExpressionResolver sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver(); final SqlExpressionResolver sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver();
@ -274,6 +274,7 @@ public class SimpleForeignKeyDescriptor implements ForeignKeyDescriptor, BasicVa
) )
), ),
selectableMapping.getJdbcMapping().getJavaTypeDescriptor(), selectableMapping.getJdbcMapping().getJavaTypeDescriptor(),
fetchParent,
sqlAstCreationState.getCreationContext().getSessionFactory().getTypeConfiguration() sqlAstCreationState.getCreationContext().getSessionFactory().getTypeConfiguration()
); );

View File

@ -803,6 +803,7 @@ public class ToOneAttributeMapping
fetchablePath, fetchablePath,
parentTableGroup, parentTableGroup,
sideNature, sideNature,
fetchParent,
creationState creationState
); );
} }
@ -966,6 +967,7 @@ public class ToOneAttributeMapping
creationState.getSqlAstCreationState() creationState.getSqlAstCreationState()
.getFromClauseAccess() .getFromClauseAccess()
.findTableGroup( realFetchParent.getNavigablePath() ), .findTableGroup( realFetchParent.getNavigablePath() ),
fetchParent,
creationState creationState
); );
} }
@ -1023,6 +1025,7 @@ public class ToOneAttributeMapping
fetchablePath, fetchablePath,
tableGroup, tableGroup,
sideNature, sideNature,
fetchParent,
creationState creationState
), ),
isSelectByUniqueKey( sideNature ) isSelectByUniqueKey( sideNature )
@ -1069,6 +1072,7 @@ public class ToOneAttributeMapping
keyResult = foreignKeyDescriptor.createKeyDomainResult( keyResult = foreignKeyDescriptor.createKeyDomainResult(
fetchablePath, fetchablePath,
parentTableGroup, parentTableGroup,
fetchParent,
creationState creationState
); );
} }
@ -1076,6 +1080,7 @@ public class ToOneAttributeMapping
keyResult = foreignKeyDescriptor.createTargetDomainResult( keyResult = foreignKeyDescriptor.createTargetDomainResult(
fetchablePath, fetchablePath,
parentTableGroup, parentTableGroup,
fetchParent,
creationState creationState
); );
} }
@ -1134,6 +1139,7 @@ public class ToOneAttributeMapping
fetchablePath, fetchablePath,
parentTableGroup, parentTableGroup,
side, side,
fetchParent,
creationState creationState
); );
final boolean selectByUniqueKey = isSelectByUniqueKey( side ); final boolean selectByUniqueKey = isSelectByUniqueKey( side );

View File

@ -293,7 +293,7 @@ public class DomainResultCreationStateImpl
public SqlSelection resolveSqlSelection( public SqlSelection resolveSqlSelection(
Expression expression, Expression expression,
JavaType<?> javaType, JavaType<?> javaType,
TypeConfiguration typeConfiguration) { FetchParent fetchParent, TypeConfiguration typeConfiguration) {
if ( expression == null ) { if ( expression == null ) {
throw new IllegalArgumentException( "Expression cannot be null" ); throw new IllegalArgumentException( "Expression cannot be null" );
} }

View File

@ -92,6 +92,7 @@ public class CompleteFetchBuilderEmbeddableValuedModelPart
} }
), ),
modelPart.getJavaType(), modelPart.getJavaType(),
null,
creationStateImpl.getSessionFactory().getTypeConfiguration() creationStateImpl.getSessionFactory().getTypeConfiguration()
); );
} }

View File

@ -96,6 +96,7 @@ public class CompleteFetchBuilderEntityValuedModelPart
} }
), ),
modelPart.getJavaType(), modelPart.getJavaType(),
null,
creationStateImpl.getSessionFactory().getTypeConfiguration() creationStateImpl.getSessionFactory().getTypeConfiguration()
); );
} }

View File

@ -87,6 +87,7 @@ public class CompleteResultBuilderBasicModelPart
} }
), ),
modelPart.getJavaType(), modelPart.getJavaType(),
null,
creationStateImpl.getSessionFactory().getTypeConfiguration() creationStateImpl.getSessionFactory().getTypeConfiguration()
); );

View File

@ -132,6 +132,7 @@ public class CompleteResultBuilderBasicValuedConverted<O,R> implements CompleteR
} }
), ),
valueConverter.getDomainJavaType(), valueConverter.getDomainJavaType(),
null,
sessionFactory.getTypeConfiguration() sessionFactory.getTypeConfiguration()
); );

View File

@ -138,6 +138,7 @@ public class CompleteResultBuilderBasicValuedStandard implements CompleteResultB
} }
), ),
explicitJavaType, explicitJavaType,
null,
sessionFactory.getTypeConfiguration() sessionFactory.getTypeConfiguration()
); );

View File

@ -168,6 +168,7 @@ public class CompleteResultBuilderCollectionStandard implements CompleteResultBu
} }
), ),
selectableMapping.getJdbcMapping().getMappedJavaType(), selectableMapping.getJdbcMapping().getMappedJavaType(),
null,
creationStateImpl.getSessionFactory().getTypeConfiguration() creationStateImpl.getSessionFactory().getTypeConfiguration()
); );
}; };

View File

@ -247,6 +247,7 @@ public class DynamicFetchBuilderLegacy implements DynamicFetchBuilder, NativeQue
} }
), ),
jdbcMapping.getMappedJavaType(), jdbcMapping.getMappedJavaType(),
null,
domainResultCreationState.getSqlAstCreationState().getCreationContext().getSessionFactory().getTypeConfiguration() domainResultCreationState.getSqlAstCreationState().getCreationContext().getSessionFactory().getTypeConfiguration()
); );
} }

View File

@ -97,6 +97,7 @@ public class DynamicFetchBuilderStandard
} }
), ),
selectableMapping.getJdbcMapping().getMappedJavaType(), selectableMapping.getJdbcMapping().getMappedJavaType(),
null,
domainResultCreationState.getSqlAstCreationState() domainResultCreationState.getSqlAstCreationState()
.getCreationContext() .getCreationContext()
.getSessionFactory() .getSessionFactory()

View File

@ -89,6 +89,7 @@ public class DynamicResultBuilderAttribute implements DynamicResultBuilder, Nati
} }
), ),
attributeMapping.getJavaType(), attributeMapping.getJavaType(),
null,
domainResultCreationState.getSqlAstCreationState() domainResultCreationState.getSqlAstCreationState()
.getCreationContext() .getCreationContext()
.getSessionFactory() .getSessionFactory()

View File

@ -127,6 +127,7 @@ public class DynamicResultBuilderBasicConverted<O,R> implements DynamicResultBui
} }
), ),
basicValueConverter.getDomainJavaType(), basicValueConverter.getDomainJavaType(),
null,
typeConfiguration typeConfiguration
); );

View File

@ -164,6 +164,7 @@ public class DynamicResultBuilderBasicStandard implements DynamicResultBuilderBa
final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection( final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection(
expression, expression,
javaType, javaType,
null,
sessionFactory.getTypeConfiguration() sessionFactory.getTypeConfiguration()
); );

View File

@ -290,6 +290,7 @@ public class DynamicResultBuilderEntityStandard
} }
), ),
jdbcMapping.getMappedJavaType(), jdbcMapping.getMappedJavaType(),
null,
domainResultCreationState.getSqlAstCreationState().getCreationContext().getSessionFactory().getTypeConfiguration() domainResultCreationState.getSqlAstCreationState().getCreationContext().getSessionFactory().getTypeConfiguration()
); );
} }

View File

@ -86,6 +86,7 @@ public class ImplicitFetchBuilderBasic implements ImplicitFetchBuilder, BasicVal
final SqlSelection sqlSelection = creationStateImpl.resolveSqlSelection( final SqlSelection sqlSelection = creationStateImpl.resolveSqlSelection(
expression, expression,
fetchable.getJavaType(), fetchable.getJavaType(),
parent,
domainResultCreationState.getSqlAstCreationState() domainResultCreationState.getSqlAstCreationState()
.getCreationContext() .getCreationContext()
.getSessionFactory() .getSessionFactory()

View File

@ -106,6 +106,7 @@ public class SelfRenderingFunctionSqlAstExpression
.resolveSqlSelection( .resolveSqlSelection(
this, this,
type.getExpressibleJavaType(), type.getExpressibleJavaType(),
null,
creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration() creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration()
) )
.getValuesArrayPosition(), .getValuesArrayPosition(),
@ -183,6 +184,7 @@ public class SelfRenderingFunctionSqlAstExpression
sqlExpressionResolver.resolveSqlSelection( sqlExpressionResolver.resolveSqlSelection(
this, this,
type.getExpressibleJavaType(), type.getExpressibleJavaType(),
null,
sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration() sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration()
); );
} }

View File

@ -492,6 +492,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
this.deduplicateSelectionItems = deduplicateSelectionItems; this.deduplicateSelectionItems = deduplicateSelectionItems;
if ( statement instanceof SqmSelectStatement<?> ) { if ( statement instanceof SqmSelectStatement<?> ) {
final SqmQueryPart<?> queryPart = ( (SqmSelectStatement<?>) statement ).getQueryPart();
// NOTE: note the difference here between `JpaSelection#getSelectionItems` // NOTE: note the difference here between `JpaSelection#getSelectionItems`
// and `SqmSelectClause#getSelections`. // and `SqmSelectClause#getSelections`.
// //
@ -502,13 +503,21 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
// - `#getSelections` returns top-level selections. These are ultimately the // - `#getSelections` returns top-level selections. These are ultimately the
// domain-results of the query // domain-results of the query
this.domainResults = new ArrayList<>( this.domainResults = new ArrayList<>(
( (SqmSelectStatement<?>) statement ).getQueryPart() queryPart.getFirstQuerySpec()
.getFirstQuerySpec()
.getSelectClause() .getSelectClause()
.getSelections() .getSelections()
.size() .size()
); );
// We can't deduplicate select items with query groups,
// otherwise a query might fail with inconsistent select items
//
// select e1.id, e1.id from Entity1 e1
// union all
// select e2.id, e2.parentId from Entity2 e2
if ( queryPart instanceof SqmQueryGroup<?> ) {
this.deduplicateSelectionItems = false;
}
final AppliedGraph appliedGraph = queryOptions.getAppliedGraph(); final AppliedGraph appliedGraph = queryOptions.getAppliedGraph();
if ( appliedGraph != null && appliedGraph.getSemantic() != null && appliedGraph.getGraph() != null ) { if ( appliedGraph != null && appliedGraph.getSemantic() != null && appliedGraph.getGraph() != null ) {
this.entityGraphTraversalState = new StandardEntityGraphTraversalStateImpl( this.entityGraphTraversalState = new StandardEntityGraphTraversalStateImpl(
@ -6914,8 +6923,9 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
public SqlSelection resolveSqlSelection( public SqlSelection resolveSqlSelection(
Expression expression, Expression expression,
JavaType<?> javaType, JavaType<?> javaType,
FetchParent fetchParent,
TypeConfiguration typeConfiguration) { TypeConfiguration typeConfiguration) {
return delegate.resolveSqlSelection( expression, javaType, typeConfiguration ); return delegate.resolveSqlSelection( expression, javaType, fetchParent, typeConfiguration );
} }
public void setSqmAliasedNodeCollector(SqmAliasedNodeCollector sqmAliasedNodeCollector) { public void setSqmAliasedNodeCollector(SqmAliasedNodeCollector sqmAliasedNodeCollector) {
@ -6967,8 +6977,9 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
public SqlSelection resolveSqlSelection( public SqlSelection resolveSqlSelection(
Expression expression, Expression expression,
JavaType<?> javaType, JavaType<?> javaType,
FetchParent fetchParent,
TypeConfiguration typeConfiguration) { TypeConfiguration typeConfiguration) {
SqlSelection selection = delegate.resolveSqlSelection( expression, javaType, typeConfiguration ); SqlSelection selection = delegate.resolveSqlSelection( expression, javaType, fetchParent, typeConfiguration );
List<SqlSelection> sqlSelectionList = sqlSelectionsForSqmSelection[index]; List<SqlSelection> sqlSelectionList = sqlSelectionsForSqmSelection[index];
if ( sqlSelectionList == null ) { if ( sqlSelectionList == null ) {
sqlSelectionsForSqmSelection[index] = sqlSelectionList = new ArrayList<>(); sqlSelectionsForSqmSelection[index] = sqlSelectionList = new ArrayList<>();

View File

@ -262,6 +262,7 @@ public class EntityValuedPathInterpretation<T> extends AbstractSqmPathInterpreta
creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection( creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection(
sqlExpression, sqlExpression,
getExpressionType().getJavaType(), getExpressionType().getJavaType(),
null,
creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration() creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration()
); );
} }

View File

@ -22,6 +22,7 @@ import org.hibernate.sql.ast.spi.SqlExpressionResolver;
import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.ast.spi.SqlSelection;
import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.expression.Expression;
import org.hibernate.sql.ast.tree.expression.SqlSelectionExpression; import org.hibernate.sql.ast.tree.expression.SqlSelectionExpression;
import org.hibernate.sql.results.graph.FetchParent;
import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.descriptor.java.JavaType;
import org.hibernate.type.spi.TypeConfiguration; import org.hibernate.type.spi.TypeConfiguration;
@ -139,7 +140,7 @@ public class SqlAstProcessingStateImpl
public SqlSelection resolveSqlSelection( public SqlSelection resolveSqlSelection(
Expression expression, Expression expression,
JavaType<?> javaType, JavaType<?> javaType,
TypeConfiguration typeConfiguration) { FetchParent fetchParent, TypeConfiguration typeConfiguration) {
throw new ConversionException( "Unexpected call to resolve SqlSelection outside of QuerySpec processing" ); throw new ConversionException( "Unexpected call to resolve SqlSelection outside of QuerySpec processing" );
} }

View File

@ -21,6 +21,7 @@ import org.hibernate.sql.ast.tree.expression.Expression;
import org.hibernate.sql.ast.tree.select.QueryPart; import org.hibernate.sql.ast.tree.select.QueryPart;
import org.hibernate.sql.ast.tree.select.QuerySpec; import org.hibernate.sql.ast.tree.select.QuerySpec;
import org.hibernate.sql.ast.tree.select.SelectClause; import org.hibernate.sql.ast.tree.select.SelectClause;
import org.hibernate.sql.results.graph.FetchParent;
import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.descriptor.java.JavaType;
import org.hibernate.type.spi.TypeConfiguration; import org.hibernate.type.spi.TypeConfiguration;
@ -65,6 +66,7 @@ public class SqlAstQueryPartProcessingStateImpl
// SqlExpressionResolver // SqlExpressionResolver
private Map<Expression, SqlSelection> sqlSelectionMap; private Map<Expression, SqlSelection> sqlSelectionMap;
private Map<FetchParent, Map<Expression, SqlSelection>> fetchParentSqlSelectionMap;
@Override @Override
protected Map<Expression, SqlSelection> sqlSelectionMap() { protected Map<Expression, SqlSelection> sqlSelectionMap() {
@ -75,6 +77,7 @@ public class SqlAstQueryPartProcessingStateImpl
public SqlSelection resolveSqlSelection( public SqlSelection resolveSqlSelection(
Expression expression, Expression expression,
JavaType<?> javaType, JavaType<?> javaType,
FetchParent fetchParent,
TypeConfiguration typeConfiguration) { TypeConfiguration typeConfiguration) {
final SqlSelection existing; final SqlSelection existing;
if ( sqlSelectionMap == null ) { if ( sqlSelectionMap == null ) {
@ -88,6 +91,31 @@ public class SqlAstQueryPartProcessingStateImpl
if ( existing != null && deduplicateSelectionItems ) { if ( existing != null && deduplicateSelectionItems ) {
return existing; return existing;
} }
final Map<Expression, SqlSelection> fetchParentSelections;
if ( !deduplicateSelectionItems && fetchParent != null ) {
// De-duplicate selection items within the root of a fetch parent
final FetchParent root = fetchParent.getRoot();
if ( fetchParentSqlSelectionMap == null ) {
fetchParentSqlSelectionMap = new HashMap<>();
fetchParentSqlSelectionMap.put( root, fetchParentSelections = new HashMap<>() );
}
else {
final Map<Expression, SqlSelection> map = fetchParentSqlSelectionMap.get( root );
if ( map == null ) {
fetchParentSqlSelectionMap.put( root, fetchParentSelections = new HashMap<>() );
}
else {
fetchParentSelections = map;
}
}
final SqlSelection sqlSelection = fetchParentSelections.get( expression );
if ( sqlSelection != null ) {
return sqlSelection;
}
}
else {
fetchParentSelections = null;
}
final SelectClause selectClause = ( (QuerySpec) queryPart ).getSelectClause(); final SelectClause selectClause = ( (QuerySpec) queryPart ).getSelectClause();
final int valuesArrayPosition = selectClause.getSqlSelections().size(); final int valuesArrayPosition = selectClause.getSqlSelections().size();
@ -98,9 +126,13 @@ public class SqlAstQueryPartProcessingStateImpl
typeConfiguration typeConfiguration
); );
selectClause.addSqlSelection( sqlSelection );
sqlSelectionMap.put( expression, sqlSelection ); sqlSelectionMap.put( expression, sqlSelection );
selectClause.addSqlSelection( sqlSelection ); if ( fetchParentSelections != null ) {
fetchParentSelections.put( expression, sqlSelection );
}
return sqlSelection; return sqlSelection;
} }

View File

@ -120,6 +120,7 @@ public class SqmParameterInterpretation implements Expression, DomainResultProdu
final SqlSelection sqlSelection = creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection( final SqlSelection sqlSelection = creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection(
resolvedExpression, resolvedExpression,
sqmExpressible.getExpressibleJavaType(), sqmExpressible.getExpressibleJavaType(),
null,
sessionFactory.getTypeConfiguration() sessionFactory.getTypeConfiguration()
); );
@ -164,6 +165,7 @@ public class SqmParameterInterpretation implements Expression, DomainResultProdu
return creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection( return creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection(
resolvedExpression, resolvedExpression,
sqmExpressible.getExpressibleJavaType(), sqmExpressible.getExpressibleJavaType(),
null,
sessionFactory.getTypeConfiguration() sessionFactory.getTypeConfiguration()
); );
} }

View File

@ -63,6 +63,7 @@ public class Conversion
creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection( creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection(
this, this,
type.getJdbcMapping().getJavaTypeDescriptor(), type.getJdbcMapping().getJavaTypeDescriptor(),
null,
creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration() creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration()
).getValuesArrayPosition(), ).getValuesArrayPosition(),
resultVariable, resultVariable,
@ -78,6 +79,7 @@ public class Conversion
sqlExpressionResolver.resolveSqlSelection( sqlExpressionResolver.resolveSqlSelection(
this, this,
type.getJdbcMapping().getJavaTypeDescriptor(), type.getJdbcMapping().getJavaTypeDescriptor(),
null,
sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration() sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration()
); );
} }

View File

@ -12,6 +12,7 @@ import java.util.function.Function;
import org.hibernate.metamodel.mapping.SelectableMapping; import org.hibernate.metamodel.mapping.SelectableMapping;
import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.expression.Expression;
import org.hibernate.sql.ast.tree.from.TableReference; import org.hibernate.sql.ast.tree.from.TableReference;
import org.hibernate.sql.results.graph.FetchParent;
import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.descriptor.java.JavaType;
import org.hibernate.type.spi.TypeConfiguration; import org.hibernate.type.spi.TypeConfiguration;
@ -77,5 +78,5 @@ public interface SqlExpressionResolver {
SqlSelection resolveSqlSelection( SqlSelection resolveSqlSelection(
Expression expression, Expression expression,
JavaType<?> javaType, JavaType<?> javaType,
TypeConfiguration typeConfiguration); FetchParent fetchParent, TypeConfiguration typeConfiguration);
} }

View File

@ -53,6 +53,7 @@ public class Any implements Expression, DomainResultProducer {
creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection( creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection(
this, this,
javaType, javaType,
null,
creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration() creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration()
).getValuesArrayPosition(), ).getValuesArrayPosition(),
resultVariable, resultVariable,
@ -68,6 +69,7 @@ public class Any implements Expression, DomainResultProducer {
sqlExpressionResolver.resolveSqlSelection( sqlExpressionResolver.resolveSqlSelection(
this, this,
type.getJdbcMappings().get( 0 ).getJavaTypeDescriptor(), type.getJdbcMappings().get( 0 ).getJavaTypeDescriptor(),
null,
sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration() sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration()
); );
} }

View File

@ -70,6 +70,7 @@ public class BinaryArithmeticExpression implements Expression, DomainResultProdu
return creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection( return creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection(
this, this,
resultType.getJdbcMapping().getJavaTypeDescriptor(), resultType.getJdbcMapping().getJavaTypeDescriptor(),
null,
creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration() creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration()
); );
} }

View File

@ -68,6 +68,7 @@ public class CaseSearchedExpression implements Expression, DomainResultProducer
.resolveSqlSelection( .resolveSqlSelection(
this, this,
type.getExpressibleJavaType(), type.getExpressibleJavaType(),
null,
creationState.getSqlAstCreationState() creationState.getSqlAstCreationState()
.getCreationContext() .getCreationContext()
.getSessionFactory() .getSessionFactory()
@ -89,6 +90,7 @@ public class CaseSearchedExpression implements Expression, DomainResultProducer
sqlExpressionResolver.resolveSqlSelection( sqlExpressionResolver.resolveSqlSelection(
this, this,
type.getExpressibleJavaType(), type.getExpressibleJavaType(),
null,
creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration() creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration()
); );
} }

View File

@ -66,6 +66,7 @@ public class CaseSimpleExpression implements Expression, DomainResultProducer {
creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection( creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection(
this, this,
javaType, javaType,
null,
creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration() creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration()
).getValuesArrayPosition(), ).getValuesArrayPosition(),
resultVariable, resultVariable,
@ -81,6 +82,7 @@ public class CaseSimpleExpression implements Expression, DomainResultProducer {
sqlExpressionResolver.resolveSqlSelection( sqlExpressionResolver.resolveSqlSelection(
this, this,
type.getJdbcMappings().get( 0 ).getJavaTypeDescriptor(), type.getJdbcMappings().get( 0 ).getJavaTypeDescriptor(),
null,
sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration() sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration()
); );
} }

View File

@ -76,6 +76,7 @@ public class ConvertedQueryLiteral<D,R> implements Literal, DomainResultProducer
expressionResolver.resolveSqlSelection( expressionResolver.resolveSqlSelection(
this, this,
relationalMapping.getExpressibleJavaType(), relationalMapping.getExpressibleJavaType(),
null,
sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration() sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration()
); );
} }

View File

@ -61,6 +61,7 @@ public class Duration implements Expression, DomainResultProducer {
creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection( creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection(
this, this,
type.getJdbcMapping().getJavaTypeDescriptor(), type.getJdbcMapping().getJavaTypeDescriptor(),
null,
creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration() creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration()
).getValuesArrayPosition(), ).getValuesArrayPosition(),
resultVariable, resultVariable,
@ -76,6 +77,7 @@ public class Duration implements Expression, DomainResultProducer {
sqlExpressionResolver.resolveSqlSelection( sqlExpressionResolver.resolveSqlSelection(
this, this,
type.getJdbcMapping().getJavaTypeDescriptor(), type.getJdbcMapping().getJavaTypeDescriptor(),
null,
sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration() sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration()
); );
} }

View File

@ -113,6 +113,7 @@ public class EntityTypeLiteral implements Expression, MappingModelExpressible, D
.resolveSqlSelection( .resolveSqlSelection(
this, this,
discriminatorType.getExpressibleJavaType(), discriminatorType.getExpressibleJavaType(),
null,
creationState.getSqlAstCreationState().getCreationContext() creationState.getSqlAstCreationState().getCreationContext()
.getMappingMetamodel().getTypeConfiguration() .getMappingMetamodel().getTypeConfiguration()
); );

View File

@ -53,6 +53,7 @@ public class Every implements Expression, DomainResultProducer {
creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection( creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection(
this, this,
javaType, javaType,
null,
creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration() creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration()
).getValuesArrayPosition(), ).getValuesArrayPosition(),
resultVariable, resultVariable,
@ -68,6 +69,7 @@ public class Every implements Expression, DomainResultProducer {
sqlExpressionResolver.resolveSqlSelection( sqlExpressionResolver.resolveSqlSelection(
this, this,
type.getJdbcMappings().get( 0 ).getJavaTypeDescriptor(), type.getJdbcMappings().get( 0 ).getJavaTypeDescriptor(),
null,
sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration() sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration()
); );
} }

View File

@ -140,6 +140,7 @@ public class JdbcLiteral<T> implements Literal, MappingModelExpressible<T>, Doma
final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection( final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection(
this, this,
jdbcMapping.getJavaTypeDescriptor(), jdbcMapping.getJavaTypeDescriptor(),
null,
sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration() sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration()
); );
@ -155,6 +156,7 @@ public class JdbcLiteral<T> implements Literal, MappingModelExpressible<T>, Doma
sqlExpressionResolver.resolveSqlSelection( sqlExpressionResolver.resolveSqlSelection(
this, this,
jdbcMapping.getJavaTypeDescriptor(), jdbcMapping.getJavaTypeDescriptor(),
null,
sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration() sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration()
); );
} }

View File

@ -137,6 +137,7 @@ public class Over<T> implements Expression, DomainResultProducer<T> {
return creationState.getSqlExpressionResolver().resolveSqlSelection( return creationState.getSqlExpressionResolver().resolveSqlSelection(
this, this,
expression.getExpressionType().getJdbcMappings().get( 0 ).getMappedJavaType(), expression.getExpressionType().getJdbcMappings().get( 0 ).getMappedJavaType(),
null,
creationState.getCreationContext().getSessionFactory().getTypeConfiguration() creationState.getCreationContext().getSessionFactory().getTypeConfiguration()
); );
} }

View File

@ -105,6 +105,7 @@ public class QueryLiteral<T> implements Literal, DomainResultProducer<T> {
final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection( final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection(
this, this,
type.getMappedType().getMappedJavaType(), type.getMappedType().getMappedJavaType(),
null,
creationState.getSqlAstCreationState() creationState.getSqlAstCreationState()
.getCreationContext() .getCreationContext()
.getSessionFactory() .getSessionFactory()
@ -147,6 +148,7 @@ public class QueryLiteral<T> implements Literal, DomainResultProducer<T> {
creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection( creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection(
this, this,
type.getJdbcMapping().getJavaTypeDescriptor(), type.getJdbcMapping().getJavaTypeDescriptor(),
null,
creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration() creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration()
); );
} }

View File

@ -72,6 +72,7 @@ public class SqlTuple implements Expression, SqlTupleContainer, DomainResultProd
valuesArrayPositions[i] = creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection( valuesArrayPositions[i] = creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection(
expressions.get( i ), expressions.get( i ),
javaType, javaType,
null,
creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration() creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration()
).getValuesArrayPosition(); ).getValuesArrayPosition();
} }

View File

@ -60,6 +60,7 @@ public class UnaryOperation implements Expression, DomainResultProducer {
final SqlSelection sqlSelection = creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection( final SqlSelection sqlSelection = creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection(
this, this,
type.getJdbcMapping().getJavaTypeDescriptor(), type.getJdbcMapping().getJavaTypeDescriptor(),
null,
creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration() creationState.getSqlAstCreationState().getCreationContext().getMappingMetamodel().getTypeConfiguration()
); );
@ -79,6 +80,7 @@ public class UnaryOperation implements Expression, DomainResultProducer {
sqlExpressionResolver.resolveSqlSelection( sqlExpressionResolver.resolveSqlSelection(
this, this,
type.getJdbcMapping().getJavaTypeDescriptor(), type.getJdbcMapping().getJavaTypeDescriptor(),
null,
sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration() sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration()
); );
} }

View File

@ -40,6 +40,7 @@ public interface Predicate extends Expression, DomainResultProducer<Boolean> {
final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection( final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection(
this, this,
javaType, javaType,
null,
sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration() sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration()
); );
@ -55,6 +56,7 @@ public interface Predicate extends Expression, DomainResultProducer<Boolean> {
sqlExpressionResolver.resolveSqlSelection( sqlExpressionResolver.resolveSqlSelection(
this, this,
getExpressionType().getJdbcMappings().get( 0 ).getJavaTypeDescriptor(), getExpressionType().getJdbcMappings().get( 0 ).getJavaTypeDescriptor(),
null,
sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration() sqlAstCreationState.getCreationContext().getMappingMetamodel().getTypeConfiguration()
); );
} }

View File

@ -13,7 +13,6 @@ import java.util.function.Function;
import org.hibernate.metamodel.mapping.JdbcMappingContainer; import org.hibernate.metamodel.mapping.JdbcMappingContainer;
import org.hibernate.query.sqm.sql.internal.DomainResultProducer; import org.hibernate.query.sqm.sql.internal.DomainResultProducer;
import org.hibernate.query.sqm.tree.expression.SqmAliasedNodeRef;
import org.hibernate.sql.ast.SqlAstWalker; import org.hibernate.sql.ast.SqlAstWalker;
import org.hibernate.sql.ast.spi.SqlAstTreeHelper; import org.hibernate.sql.ast.spi.SqlAstTreeHelper;
import org.hibernate.sql.ast.spi.SqlExpressionResolver; import org.hibernate.sql.ast.spi.SqlExpressionResolver;
@ -154,6 +153,7 @@ public class QuerySpec extends QueryPart implements SqlAstNode, PredicateContain
creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection( creationState.getSqlAstCreationState().getSqlExpressionResolver().resolveSqlSelection(
this, this,
jdbcMapping.getJavaTypeDescriptor(), jdbcMapping.getJavaTypeDescriptor(),
null,
typeConfiguration typeConfiguration
); );
} }
@ -175,6 +175,7 @@ public class QuerySpec extends QueryPart implements SqlAstNode, PredicateContain
final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection( final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection(
this, this,
descriptor, descriptor,
null,
typeConfiguration typeConfiguration
); );

View File

@ -88,6 +88,13 @@ public interface FetchParent extends DomainResultGraphNode {
Fetch findFetch(Fetchable fetchable); Fetch findFetch(Fetchable fetchable);
default FetchParent getRoot() {
if ( this instanceof Fetch ) {
return ( (Fetch) this ).getFetchParent().getRoot();
}
return this;
}
default Fetch generateFetchableFetch( default Fetch generateFetchableFetch(
Fetchable fetchable, Fetchable fetchable,
NavigablePath fetchablePath, NavigablePath fetchablePath,

View File

@ -56,6 +56,7 @@ public class CollectionDomainResult implements DomainResult, CollectionResultGra
fkResult = loadingAttribute.getKeyDescriptor().createKeyDomainResult( fkResult = loadingAttribute.getKeyDescriptor().createKeyDomainResult(
loadingPath, loadingPath,
tableGroup, tableGroup,
this,
creationState creationState
); );

View File

@ -90,8 +90,18 @@ public class EagerCollectionFetch extends CollectionFetch implements FetchParent
final ForeignKeyDescriptor keyDescriptor = fetchedAttribute.getKeyDescriptor(); final ForeignKeyDescriptor keyDescriptor = fetchedAttribute.getKeyDescriptor();
// The collection key must be fetched from the side of the declaring type of the attribute // The collection key must be fetched from the side of the declaring type of the attribute
// So that this is guaranteed to be not-null // So that this is guaranteed to be not-null
collectionKeyResult = keyDescriptor.createTargetDomainResult( fetchedPath, parentTableGroup, creationState ); collectionKeyResult = keyDescriptor.createTargetDomainResult(
collectionValueKeyResult = keyDescriptor.createKeyDomainResult( fetchedPath, collectionTableGroup, creationState ); fetchedPath,
parentTableGroup,
fetchParent,
creationState
);
collectionValueKeyResult = keyDescriptor.createKeyDomainResult(
fetchedPath,
collectionTableGroup,
fetchParent,
creationState
);
fetches = creationState.visitFetches( this ); fetches = creationState.visitFetches( this );
if ( fetchedAttribute.getIndexDescriptor() != null ) { if ( fetchedAttribute.getIndexDescriptor() != null ) {

View File

@ -18,6 +18,7 @@ import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.DomainResultAssembler; import org.hibernate.sql.results.graph.DomainResultAssembler;
import org.hibernate.sql.results.graph.DomainResultCreationState; import org.hibernate.sql.results.graph.DomainResultCreationState;
import org.hibernate.sql.results.graph.Fetch; import org.hibernate.sql.results.graph.Fetch;
import org.hibernate.sql.results.graph.FetchParent;
import org.hibernate.sql.results.graph.FetchParentAccess; import org.hibernate.sql.results.graph.FetchParentAccess;
import org.hibernate.sql.results.graph.Fetchable; import org.hibernate.sql.results.graph.Fetchable;
import org.hibernate.sql.results.graph.embeddable.EmbeddableInitializer; import org.hibernate.sql.results.graph.embeddable.EmbeddableInitializer;
@ -31,17 +32,25 @@ public class EmbeddableForeignKeyResultImpl<T>
implements EmbeddableResultGraphNode, DomainResult<T> { implements EmbeddableResultGraphNode, DomainResult<T> {
private final String resultVariable; private final String resultVariable;
private final FetchParent fetchParent;
public EmbeddableForeignKeyResultImpl( public EmbeddableForeignKeyResultImpl(
NavigablePath navigablePath, NavigablePath navigablePath,
EmbeddableValuedModelPart embeddableValuedModelPart, EmbeddableValuedModelPart embeddableValuedModelPart,
String resultVariable, String resultVariable,
FetchParent fetchParent,
DomainResultCreationState creationState) { DomainResultCreationState creationState) {
super( embeddableValuedModelPart.getEmbeddableTypeDescriptor(), navigablePath ); super( embeddableValuedModelPart.getEmbeddableTypeDescriptor(), navigablePath );
this.resultVariable = resultVariable; this.resultVariable = resultVariable;
this.fetchParent = fetchParent;
this.fetches = creationState.visitFetches( this ); this.fetches = creationState.visitFetches( this );
} }
@Override
public FetchParent getRoot() {
return fetchParent.getRoot();
}
@Override @Override
public boolean containsAnyNonScalarResults() { public boolean containsAnyNonScalarResults() {
return true; return true;

View File

@ -114,6 +114,7 @@ public abstract class AbstractEntityResultGraphNode extends AbstractFetchParent
.createKeyDomainResult( .createKeyDomainResult(
navigablePath.getParent(), navigablePath.getParent(),
entityTableGroup, entityTableGroup,
this,
creationState creationState
); );
} }

View File

@ -40,6 +40,7 @@ public class EntityDelayedResultImpl implements DomainResult {
this.identifierResult = entityValuedModelPart.getForeignKeyDescriptor().createKeyDomainResult( this.identifierResult = entityValuedModelPart.getForeignKeyDescriptor().createKeyDomainResult(
navigablePath.append( EntityIdentifierMapping.ROLE_LOCAL_NAME ), navigablePath.append( EntityIdentifierMapping.ROLE_LOCAL_NAME ),
rootTableGroup, rootTableGroup,
null,
creationState creationState
); );
} }

View File

@ -44,8 +44,13 @@ public class NotFoundSnapshotResult implements DomainResult {
// however, that would mean a 1-1 with a join-table which // however, that would mean a 1-1 with a join-table which
// is pretty odd mapping // is pretty odd mapping
final ForeignKeyDescriptor fkDescriptor = toOneMapping.getForeignKeyDescriptor(); final ForeignKeyDescriptor fkDescriptor = toOneMapping.getForeignKeyDescriptor();
this.keyResult = fkDescriptor.createKeyDomainResult( navigablePath, keyTableGroup, creationState ); this.keyResult = fkDescriptor.createKeyDomainResult( navigablePath, keyTableGroup, null, creationState );
this.targetResult = fkDescriptor.createTargetDomainResult( navigablePath, targetTableGroup, creationState ); this.targetResult = fkDescriptor.createTargetDomainResult(
navigablePath,
targetTableGroup,
null,
creationState
);
} }
@Override @Override