Skip to content

Commit 5d0ece3

Browse files
committed
HHH-19524 @OnetoOne relationship unnecessary joins in nativeQuery
1 parent ca70301 commit 5d0ece3

File tree

5 files changed

+21
-4
lines changed

5 files changed

+21
-4
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
@@ -51,6 +51,7 @@ public JdbcValuesMapping resolve(
5151
null,
5252
sqlSelections::add,
5353
loadQueryInfluencers,
54+
false,
5455
sessionFactory
5556
);
5657

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
@@ -1572,8 +1572,8 @@ public static class EntityB {
15721572
else {
15731573
side = this.sideNature;
15741574
}
1575-
1576-
if ( ( fetchTiming == FetchTiming.IMMEDIATE && selected ) || needsJoinFetch( side ) ) {
1575+
if ( fetchTiming == FetchTiming.IMMEDIATE && selected
1576+
|| !creationState.getSqlAstCreationState().isProcedureOrNativeQuery() && needsJoinFetch( side ) ) {
15771577
final TableGroup tableGroup = determineTableGroupForFetch(
15781578
fetchablePath,
15791579
fetchParent,
@@ -1704,9 +1704,12 @@ else if ( hasNotFoundAction()
17041704

17051705
private boolean needsJoinFetch(ForeignKeyDescriptor.Nature side) {
17061706
if ( side == ForeignKeyDescriptor.Nature.TARGET ) {
1707-
// The target model part doesn't correspond to the identifier of the target entity mapping
1708-
// so we must eagerly fetch with a join (subselect would still cause problems).
1707+
// With composite identifier if the target model part doesn't correspond to the identifier of the target entity mapping
1708+
// we must eagerly fetch with a join (subselect would still cause problems).
17091709
final EntityIdentifierMapping identifier = entityMappingType.getIdentifierMapping();
1710+
if ( identifier instanceof BasicEntityIdentifierMappingImpl ) {
1711+
return false;
1712+
}
17101713
final ValuedModelPart targetPart = foreignKeyDescriptor.getTargetPart();
17111714
if ( identifier != targetPart ) {
17121715
// 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/DomainResultCreationStateImpl.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,15 @@ public class DomainResultCreationStateImpl
8787
private boolean processingKeyFetches = false;
8888
private boolean resolvingCircularFetch;
8989
private ForeignKeyDescriptor.Nature currentlyResolvingForeignKeySide;
90+
private boolean isProcedureOrNativeQuery;
9091

9192
public DomainResultCreationStateImpl(
9293
String stateIdentifier,
9394
JdbcValuesMetadata jdbcResultsMetadata,
9495
Map<String, Map<String, DynamicFetchBuilderLegacy>> legacyFetchBuilders,
9596
Consumer<SqlSelection> sqlSelectionConsumer,
9697
LoadQueryInfluencers loadQueryInfluencers,
98+
boolean isProcedureOrNativeQuery,
9799
SessionFactoryImplementor sessionFactory) {
98100
this.stateIdentifier = stateIdentifier;
99101
this.jdbcResultsMetadata = jdbcResultsMetadata;
@@ -105,6 +107,8 @@ public DomainResultCreationStateImpl(
105107
this.legacyFetchResolver = new LegacyFetchResolverImpl( legacyFetchBuilders );
106108

107109
this.sessionFactory = sessionFactory;
110+
111+
this.isProcedureOrNativeQuery = isProcedureOrNativeQuery;
108112
}
109113

110114
public LegacyFetchResolver getLegacyFetchResolver() {
@@ -588,4 +592,8 @@ public void setCurrentlyResolvingForeignKeyPart(ForeignKeyDescriptor.Nature curr
588592
this.currentlyResolvingForeignKeySide = currentlyResolvingForeignKeySide;
589593
}
590594

595+
@Override
596+
public boolean isProcedureOrNativeQuery() {
597+
return isProcedureOrNativeQuery;
598+
}
591599
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ public JdbcValuesMapping resolve(
209209
legacyFetchBuilders,
210210
sqlSelections::add,
211211
loadQueryInfluencers,
212+
true,
212213
sessionFactory
213214
);
214215

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
@@ -54,4 +54,8 @@ default boolean supportsEntityNameUsage() {
5454
@Internal
5555
default void applyOrdering(TableGroup tableGroup, OrderByFragment orderByFragment) {
5656
}
57+
58+
default boolean isProcedureOrNativeQuery(){
59+
return false;
60+
}
5761
}

0 commit comments

Comments
 (0)