Skip to content

Commit 5b73852

Browse files
dreab8beikov
authored andcommitted
HHH-19524 @OnetoOne relationship unnecessary joins in nativeQuery
1 parent 1f43f26 commit 5b73852

File tree

5 files changed

+24
-12
lines changed

5 files changed

+24
-12
lines changed

hibernate-core/src/main/java/org/hibernate/generator/values/internal/GeneratedValuesMappingProducer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public JdbcValuesMapping resolve(
4949
null,
5050
sqlSelections::add,
5151
loadQueryInfluencers,
52+
false,
5253
sessionFactory
5354
);
5455

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1543,8 +1543,8 @@ public static class EntityB {
15431543
else {
15441544
side = this.sideNature;
15451545
}
1546-
1547-
if ( ( fetchTiming == FetchTiming.IMMEDIATE && selected ) || needsJoinFetch( side ) ) {
1546+
if ( fetchTiming == FetchTiming.IMMEDIATE && selected
1547+
|| !creationState.getSqlAstCreationState().isProcedureOrNativeQuery() && needsJoinFetch( side ) ) {
15481548
final TableGroup tableGroup = determineTableGroupForFetch(
15491549
fetchablePath,
15501550
fetchParent,
@@ -1675,9 +1675,12 @@ else if ( hasNotFoundAction()
16751675

16761676
private boolean needsJoinFetch(ForeignKeyDescriptor.Nature side) {
16771677
if ( side == ForeignKeyDescriptor.Nature.TARGET ) {
1678-
// The target model part doesn't correspond to the identifier of the target entity mapping
1679-
// so we must eagerly fetch with a join (subselect would still cause problems).
1678+
// With composite identifier if the target model part doesn't correspond to the identifier of the target entity mapping
1679+
// we must eagerly fetch with a join (subselect would still cause problems).
16801680
final EntityIdentifierMapping identifier = entityMappingType.getIdentifierMapping();
1681+
if ( identifier instanceof BasicEntityIdentifierMappingImpl ) {
1682+
return false;
1683+
}
16811684
final ValuedModelPart targetPart = foreignKeyDescriptor.getTargetPart();
16821685
if ( identifier != targetPart ) {
16831686
// If the identifier and the target part of the same class, we can preserve laziness as deferred loading will still work

hibernate-core/src/main/java/org/hibernate/query/results/internal/DomainResultCreationStateImpl.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,15 @@ public class DomainResultCreationStateImpl
8282
private boolean processingKeyFetches = false;
8383
private boolean resolvingCircularFetch;
8484
private ForeignKeyDescriptor.Nature currentlyResolvingForeignKeySide;
85+
private boolean isProcedureOrNativeQuery;
8586

8687
public DomainResultCreationStateImpl(
8788
String stateIdentifier,
8889
JdbcValuesMetadata jdbcResultsMetadata,
8990
Map<String, Map<Fetchable, LegacyFetchBuilder>> legacyFetchBuilders,
9091
Consumer<SqlSelection> sqlSelectionConsumer,
9192
LoadQueryInfluencers loadQueryInfluencers,
93+
boolean isProcedureOrNativeQuery,
9294
SessionFactoryImplementor sessionFactory) {
9395
this.stateIdentifier = stateIdentifier;
9496
this.jdbcResultsMetadata = jdbcResultsMetadata;
@@ -100,6 +102,8 @@ public DomainResultCreationStateImpl(
100102
this.legacyFetchResolver = new LegacyFetchResolver( legacyFetchBuilders );
101103

102104
this.sessionFactory = sessionFactory;
105+
106+
this.isProcedureOrNativeQuery = isProcedureOrNativeQuery;
103107
}
104108

105109
public SessionFactoryImplementor getSessionFactory() {
@@ -350,11 +354,8 @@ public Fetch visitIdentifierFetch(EntityResultGraphNode fetchParent) {
350354
final EntityIdentifierMapping identifierMapping = parentModelPart.getEntityMappingType().getIdentifierMapping();
351355
final String identifierAttributeName = attributeName( identifierMapping );
352356

353-
//noinspection unchecked
354-
final FetchBuilder explicitFetchBuilder = (FetchBuilder) fetchBuilderResolverStack
355-
.getCurrent()
356-
.apply( identifierMapping );
357-
LegacyFetchBuilder fetchBuilderLegacy;
357+
final FetchBuilder explicitFetchBuilder = fetchBuilderResolverStack.getCurrent().apply( identifierMapping );
358+
final LegacyFetchBuilder fetchBuilderLegacy;
358359
if ( explicitFetchBuilder == null ) {
359360
fetchBuilderLegacy = legacyFetchResolver.resolve(
360361
fromClauseAccess.findTableGroup( fetchParent.getNavigablePath() )
@@ -414,9 +415,7 @@ private Consumer<Fetchable> createFetchableConsumer(FetchParent fetchParent, Imm
414415
if ( !fetchable.isSelectable() ) {
415416
return;
416417
}
417-
FetchBuilder explicitFetchBuilder = (FetchBuilder) fetchBuilderResolverStack
418-
.getCurrent()
419-
.apply( fetchable );
418+
FetchBuilder explicitFetchBuilder = fetchBuilderResolverStack.getCurrent().apply( fetchable );
420419
LegacyFetchBuilder fetchBuilderLegacy;
421420
if ( explicitFetchBuilder == null ) {
422421
fetchBuilderLegacy = legacyFetchResolver.resolve(
@@ -490,4 +489,8 @@ public void setCurrentlyResolvingForeignKeyPart(ForeignKeyDescriptor.Nature curr
490489
this.currentlyResolvingForeignKeySide = currentlyResolvingForeignKeySide;
491490
}
492491

492+
@Override
493+
public boolean isProcedureOrNativeQuery() {
494+
return isProcedureOrNativeQuery;
495+
}
493496
}

hibernate-core/src/main/java/org/hibernate/query/results/internal/ResultSetMappingImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ public JdbcValuesMapping resolve(
199199
legacyFetchBuilders,
200200
sqlSelections::add,
201201
loadQueryInfluencers,
202+
true,
202203
sessionFactory
203204
);
204205

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,8 @@ default boolean supportsEntityNameUsage() {
5757
@Internal
5858
default void applyOrdering(TableGroup tableGroup, OrderByFragment orderByFragment) {
5959
}
60+
61+
default boolean isProcedureOrNativeQuery(){
62+
return false;
63+
}
6064
}

0 commit comments

Comments
 (0)