Skip to content

Commit 93e7436

Browse files
committed
HHH-18436 Apply plural attribute ordering when creating the join
1 parent b616283 commit 93e7436

File tree

5 files changed

+32
-38
lines changed

5 files changed

+32
-38
lines changed

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSelectBuilder.java

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -962,19 +962,6 @@ else if ( fetchDepth > maximumFetchDepth + 1 ) {
962962
creationState
963963
);
964964

965-
if ( fetch.getTiming() == FetchTiming.IMMEDIATE && joined ) {
966-
if ( isFetchablePluralAttributeMapping ) {
967-
final PluralAttributeMapping pluralAttributeMapping = (PluralAttributeMapping) fetchable;
968-
final QuerySpec querySpec = creationState.getInflightQueryPart().getFirstQuerySpec();
969-
applyOrdering(
970-
querySpec,
971-
fetchablePath,
972-
pluralAttributeMapping,
973-
creationState
974-
);
975-
}
976-
}
977-
978965
fetches.add( fetch );
979966
}
980967
finally {
@@ -1009,19 +996,6 @@ else if ( fetchable instanceof PluralAttributeMapping ) {
1009996
return true;
1010997
}
1011998

1012-
private void applyOrdering(
1013-
QuerySpec querySpec,
1014-
NavigablePath navigablePath,
1015-
PluralAttributeMapping pluralAttributeMapping,
1016-
LoaderSqlAstCreationState sqlAstCreationState) {
1017-
assert pluralAttributeMapping.getAttributeName().equals( navigablePath.getLocalName() );
1018-
1019-
final TableGroup tableGroup = sqlAstCreationState.getFromClauseAccess().getTableGroup( navigablePath );
1020-
assert tableGroup != null;
1021-
1022-
applyOrdering( querySpec, tableGroup, pluralAttributeMapping, sqlAstCreationState );
1023-
}
1024-
1025999
private SelectStatement generateSelect(SubselectFetch subselect) {
10261000

10271001
// todo (6.0) : we could even convert this to a join by piecing together

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSqlAstCreationState.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.hibernate.metamodel.mapping.AssociationKey;
2525
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
2626
import org.hibernate.metamodel.mapping.ModelPart;
27+
import org.hibernate.metamodel.mapping.ordering.OrderByFragment;
2728
import org.hibernate.query.spi.Limit;
2829
import org.hibernate.query.sqm.tree.from.SqmFrom;
2930
import org.hibernate.spi.NavigablePath;
@@ -41,8 +42,10 @@
4142
import org.hibernate.sql.ast.spi.SqlAstQueryPartProcessingState;
4243
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
4344
import org.hibernate.sql.ast.tree.from.FromClause;
45+
import org.hibernate.sql.ast.tree.from.TableGroup;
4446
import org.hibernate.sql.ast.tree.predicate.Predicate;
4547
import org.hibernate.sql.ast.tree.select.QueryPart;
48+
import org.hibernate.sql.ast.tree.select.QuerySpec;
4649
import org.hibernate.sql.results.graph.DomainResultCreationState;
4750
import org.hibernate.sql.results.graph.FetchParent;
4851
import org.hibernate.sql.results.graph.internal.ImmutableFetchList;
@@ -94,6 +97,13 @@ public LoaderSqlAstCreationState(
9497
);
9598
}
9699

100+
@Override
101+
public void applyOrdering(TableGroup tableGroup, OrderByFragment orderByFragment) {
102+
final QuerySpec querySpec = getInflightQueryPart().getFirstQuerySpec();
103+
assert querySpec.isRoot() : "Illegal attempt to apply order-by fragment to a non-root query spec";
104+
orderByFragment.apply( querySpec, tableGroup, this );
105+
}
106+
97107
@Override
98108
public SqlAstCreationContext getCreationContext() {
99109
return sf;

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/PluralAttributeMappingImpl.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,16 @@ public TableGroupJoin createTableGroupJoin(
737737
creationState
738738
);
739739

740+
if ( fetched ) {
741+
if ( orderByFragment != null ) {
742+
creationState.applyOrdering( tableGroup, orderByFragment );
743+
}
744+
745+
if ( manyToManyOrderByFragment != null ) {
746+
creationState.applyOrdering( tableGroup, manyToManyOrderByFragment );
747+
}
748+
}
749+
740750
final TableGroupJoin tableGroupJoin = new TableGroupJoin(
741751
navigablePath,
742752
determineSqlJoinType( lhs, requestedJoinType, fetched ),

hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8555,14 +8555,6 @@ public <R> R withNestedFetchParent(FetchParent fetchParent, Function<FetchParent
85558555

85568556
@Override
85578557
public ImmutableFetchList visitFetches(FetchParent fetchParent) {
8558-
if ( fetchParent instanceof EagerCollectionFetch && currentQuerySpec().isRoot() ) {
8559-
final EagerCollectionFetch collectionFetch = (EagerCollectionFetch) fetchParent;
8560-
final PluralAttributeMapping pluralAttributeMapping = collectionFetch.getFetchedMapping();
8561-
final NavigablePath fetchablePath = collectionFetch.getNavigablePath();
8562-
final TableGroup tableGroup = getFromClauseIndex().getTableGroup( fetchablePath );
8563-
assert tableGroup.getModelPart() == pluralAttributeMapping;
8564-
applyOrdering( tableGroup, pluralAttributeMapping );
8565-
}
85668558
final FetchableContainer referencedMappingContainer = fetchParent.getReferencedMappingContainer();
85678559
final int keySize = referencedMappingContainer.getNumberOfKeyFetchables();
85688560
final int size = referencedMappingContainer.getNumberOfFetchables();
@@ -8649,11 +8641,14 @@ private void applyOrdering(TableGroup tableGroup, PluralAttributeMapping pluralA
86498641
}
86508642
}
86518643

8652-
private void applyOrdering(TableGroup tableGroup, OrderByFragment orderByFragment) {
8653-
if ( orderByFragments == null ) {
8654-
orderByFragments = new ArrayList<>();
8644+
@Override
8645+
public void applyOrdering(TableGroup tableGroup, OrderByFragment orderByFragment) {
8646+
if ( currentQuerySpec().isRoot() ) {
8647+
if ( orderByFragments == null ) {
8648+
orderByFragments = new ArrayList<>();
8649+
}
8650+
orderByFragments.add( new AbstractMap.SimpleEntry<>( orderByFragment, tableGroup ) );
86558651
}
8656-
orderByFragments.add( new AbstractMap.SimpleEntry<>( orderByFragment, tableGroup ) );
86578652
}
86588653

86598654
@Override

hibernate-core/src/main/java/org/hibernate/sql/ast/spi/SqlAstCreationState.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.hibernate.Internal;
1010
import org.hibernate.LockMode;
1111
import org.hibernate.engine.spi.LoadQueryInfluencers;
12+
import org.hibernate.metamodel.mapping.ordering.OrderByFragment;
1213
import org.hibernate.persister.entity.EntityNameUse;
1314
import org.hibernate.sql.ast.tree.from.TableGroup;
1415

@@ -49,4 +50,8 @@ default void registerEntityNameUsage(
4950
default boolean supportsEntityNameUsage() {
5051
return false;
5152
}
53+
54+
@Internal
55+
default void applyOrdering(TableGroup tableGroup, OrderByFragment orderByFragment) {
56+
}
5257
}

0 commit comments

Comments
 (0)