Skip to content

Commit 2638bd9

Browse files
committed
HHH-18847 - Organize the org.hibernate.query.results package
1 parent ebb470a commit 2638bd9

File tree

10 files changed

+142
-88
lines changed

10 files changed

+142
-88
lines changed

hibernate-core/src/main/java/org/hibernate/query/NativeQuery.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,6 @@
44
*/
55
package org.hibernate.query;
66

7-
import java.time.Instant;
8-
import java.util.Calendar;
9-
import java.util.Collection;
10-
import java.util.Date;
11-
import java.util.Map;
12-
137
import jakarta.persistence.AttributeConverter;
148
import jakarta.persistence.CacheRetrieveMode;
159
import jakarta.persistence.CacheStoreMode;
@@ -18,7 +12,6 @@
1812
import jakarta.persistence.Parameter;
1913
import jakarta.persistence.TemporalType;
2014
import jakarta.persistence.metamodel.SingularAttribute;
21-
2215
import org.hibernate.CacheMode;
2316
import org.hibernate.FlushMode;
2417
import org.hibernate.LockMode;
@@ -31,6 +24,12 @@
3124
import org.hibernate.transform.ResultTransformer;
3225
import org.hibernate.type.BasicTypeReference;
3326

27+
import java.time.Instant;
28+
import java.util.Calendar;
29+
import java.util.Collection;
30+
import java.util.Date;
31+
import java.util.Map;
32+
3433
/**
3534
* Within the context of an active {@linkplain org.hibernate.Session session},
3635
* an instance of this type represents an executable query written in the

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,29 @@
44
*/
55
package org.hibernate.query.results;
66

7-
import java.util.function.BiConsumer;
8-
97
import org.hibernate.Incubating;
108
import org.hibernate.spi.NavigablePath;
11-
import org.hibernate.sql.results.graph.DomainResult;
129
import org.hibernate.sql.results.graph.DomainResultCreationState;
1310
import org.hibernate.sql.results.graph.Fetch;
1411
import org.hibernate.sql.results.graph.FetchParent;
1512
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata;
1613

14+
import java.util.function.BiConsumer;
15+
1716
/**
18-
* Responsible for building a single {@link DomainResult} instance as part of
19-
* the overall mapping of native / procedure query results.
17+
* Responsible for building a single {@link Fetch} instance.
18+
* Given the following HQL for illustration,
19+
* <pre>
20+
* select b from Book b join fetch b.authors
21+
* </pre>
22+
* we have a single fetch : `Book(b).authors`
23+
*
24+
* @see ResultBuilder
2025
*
21-
* @apiNote By definition a fetch is a reference to the fetched ModelPart
2226
* @author Steve Ebersole
2327
*/
2428
@Incubating
25-
public interface FetchBuilder {
29+
public interface FetchBuilder extends GraphNodeBuilder {
2630
Fetch buildFetch(
2731
FetchParent parent,
2832
NavigablePath fetchPath,
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.query.results;
6+
7+
/**
8+
* Commonality between the builders for results and fetches.
9+
*
10+
* @see ResultBuilder
11+
* @see FetchBuilder
12+
*
13+
* @author Steve Ebersole
14+
*/
15+
public interface GraphNodeBuilder {
16+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.query.results;
6+
7+
/**
8+
* Specialized FetchBuilder implementations which handle building fetches defined via:<ul>
9+
* <li>{@code hbm.xml} definitions</li>
10+
* <li>calls to {@link org.hibernate.query.NativeQuery#addFetch}, and friends</li>
11+
* </ul>
12+
*
13+
* @author Steve Ebersole
14+
*/
15+
public interface LegacyFetchBuilder extends FetchBuilder {
16+
/**
17+
* The table-alias associated with the fetch modeled by this builder.
18+
*/
19+
String getTableAlias();
20+
21+
/**
22+
* The alias for the node (result or fetch) which owns the fetch modeled by this builder.
23+
*/
24+
String getOwnerAlias();
25+
26+
/**
27+
* The name of the model-part being fetched.
28+
*/
29+
String getFetchableName();
30+
31+
@Override
32+
LegacyFetchBuilder cacheKeyInstance();
33+
}

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,19 @@
1212
import java.util.function.BiConsumer;
1313

1414
/**
15-
* Responsible for building a single {@link DomainResult} instance as part of
16-
* the overall mapping of native / procedure query results.
15+
* Responsible for building a single {@link DomainResult}.
16+
* Given the following HQL for illustration,
17+
* <pre>
18+
* select b from Book b join fetch b.authors
19+
* </pre>
20+
* we have a single result : `Book(b)`
21+
*
22+
* @see FetchBuilder
1723
*
1824
* @author Steve Ebersole
1925
*/
2026
@Incubating
21-
public interface ResultBuilder {
27+
public interface ResultBuilder extends GraphNodeBuilder {
2228
/**
2329
* Build a result
2430
*

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

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,38 @@
44
*/
55
package org.hibernate.query.results;
66

7-
import java.util.List;
8-
import java.util.function.BiConsumer;
9-
import java.util.function.Consumer;
10-
117
import org.hibernate.Incubating;
128
import org.hibernate.engine.spi.SessionFactoryImplementor;
139
import org.hibernate.query.NativeQuery;
1410
import org.hibernate.query.named.NamedResultSetMappingMemento;
15-
import org.hibernate.query.results.internal.dynamic.DynamicFetchBuilderLegacy;
1611
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMappingProducer;
1712

13+
import java.util.List;
14+
import java.util.function.BiConsumer;
15+
import java.util.function.Consumer;
16+
1817
/**
19-
* Acts as the {@link JdbcValuesMappingProducer} for {@link NativeQuery}
20-
* or {@link org.hibernate.procedure.ProcedureCall} / {@link jakarta.persistence.StoredProcedureQuery}
21-
* instances. These mappings can be defined<ul>
22-
* <li>
23-
* {@linkplain org.hibernate.query.results.internal.complete statically} using
24-
* {@link jakarta.persistence.SqlResultSetMapping}, {@code orm.xml},
25-
* {@code mapping.xml} or {@code hbm.xml}
26-
* </li>
27-
* <li>
28-
* {@linkplain org.hibernate.query.results.internal.dynamic dynamically} using Hibernate-specific APIs:<ul>
29-
* <li>{@link NativeQuery#addScalar}</li>
30-
* <li>{@link NativeQuery#addEntity}</li>
31-
* <li>{@link NativeQuery#addJoin}</li>
32-
* <li>{@link NativeQuery#addFetch}</li>
33-
* <li>{@link NativeQuery#addRoot}</li>
34-
* </ul>
35-
* </li>
18+
* JdbcValuesMappingProducer implementation based on a graph of {@linkplain ResultBuilder}
19+
* and {@linkplain FetchBuilder} reference. Used to model result-set mappings from:<ul>
20+
* <li>{@link jakarta.persistence.SqlResultSetMapping}</li>
21+
* <li>{@code orm.xml}</li>
22+
* <li>{@code mapping.xml}</li>
23+
* <li>{@code hbm.xml}</li>
24+
* <li>
25+
* Hibernate-specific APIs:<ul>
26+
* <li>{@link NativeQuery#addScalar}</li>
27+
* <li>{@link NativeQuery#addEntity}</li>
28+
* <li>{@link NativeQuery#addJoin}</li>
29+
* <li>{@link NativeQuery#addFetch}</li>
30+
* <li>{@link NativeQuery#addRoot}</li>
31+
* </ul>
32+
* </li>
3633
* </ul>
3734
*
35+
* @see NativeQuery
36+
* @see org.hibernate.procedure.ProcedureCall
37+
* @see jakarta.persistence.StoredProcedureQuery
38+
*
3839
* @author Steve Ebersole
3940
*/
4041
@Incubating
@@ -72,7 +73,7 @@ public interface ResultSetMapping extends JdbcValuesMappingProducer {
7273
* {@link ResultBuilder#visitFetchBuilders}), fetches defined in the legacy way are unassociated
7374
* to their "parent".
7475
*/
75-
void visitLegacyFetchBuilders(Consumer<DynamicFetchBuilderLegacy> resultBuilderConsumer);
76+
void visitLegacyFetchBuilders(Consumer<LegacyFetchBuilder> resultBuilderConsumer);
7677

7778
/**
7879
* Add a builder
@@ -82,7 +83,7 @@ public interface ResultSetMapping extends JdbcValuesMappingProducer {
8283
/**
8384
* Add a legacy fetch builder
8485
*/
85-
void addLegacyFetchBuilder(DynamicFetchBuilderLegacy fetchBuilder);
86+
void addLegacyFetchBuilder(LegacyFetchBuilder fetchBuilder);
8687

8788
/**
8889
* Create a memento from this mapping.

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import org.hibernate.metamodel.mapping.internal.BasicValuedCollectionPart;
2323
import org.hibernate.metamodel.mapping.internal.CaseStatementDiscriminatorMappingImpl;
2424
import org.hibernate.query.results.FetchBuilder;
25-
import org.hibernate.query.results.internal.dynamic.DynamicFetchBuilderLegacy;
25+
import org.hibernate.query.results.LegacyFetchBuilder;
2626
import org.hibernate.spi.EntityIdentifierNavigablePath;
2727
import org.hibernate.spi.NavigablePath;
2828
import org.hibernate.sql.ast.spi.SqlAliasBaseGenerator;
@@ -92,7 +92,7 @@ public class DomainResultCreationStateImpl
9292
public DomainResultCreationStateImpl(
9393
String stateIdentifier,
9494
JdbcValuesMetadata jdbcResultsMetadata,
95-
Map<String, Map<String, DynamicFetchBuilderLegacy>> legacyFetchBuilders,
95+
Map<String, Map<String, LegacyFetchBuilder>> legacyFetchBuilders,
9696
Consumer<SqlSelection> sqlSelectionConsumer,
9797
LoadQueryInfluencers loadQueryInfluencers,
9898
SessionFactoryImplementor sessionFactory) {
@@ -328,18 +328,18 @@ public SqlSelection resolveSqlSelection(
328328
}
329329

330330
private static class LegacyFetchResolver {
331-
private final Map<String,Map<String, DynamicFetchBuilderLegacy>> legacyFetchBuilders;
331+
private final Map<String,Map<String, LegacyFetchBuilder>> legacyFetchBuilders;
332332

333-
public LegacyFetchResolver(Map<String, Map<String, DynamicFetchBuilderLegacy>> legacyFetchBuilders) {
333+
public LegacyFetchResolver(Map<String, Map<String, LegacyFetchBuilder>> legacyFetchBuilders) {
334334
this.legacyFetchBuilders = legacyFetchBuilders;
335335
}
336336

337-
public DynamicFetchBuilderLegacy resolve(String ownerTableAlias, String fetchedPartPath) {
337+
public LegacyFetchBuilder resolve(String ownerTableAlias, String fetchedPartPath) {
338338
if ( legacyFetchBuilders == null ) {
339339
return null;
340340
}
341341

342-
final Map<String, DynamicFetchBuilderLegacy> fetchBuilders = legacyFetchBuilders.get( ownerTableAlias );
342+
final Map<String, LegacyFetchBuilder> fetchBuilders = legacyFetchBuilders.get( ownerTableAlias );
343343
if ( fetchBuilders == null ) {
344344
return null;
345345
}
@@ -377,7 +377,7 @@ public Fetch visitIdentifierFetch(EntityResultGraphNode fetchParent) {
377377
final Fetchable identifierFetchable = (Fetchable) identifierMapping;
378378
//noinspection unchecked
379379
final FetchBuilder explicitFetchBuilder = (FetchBuilder) fetchBuilderResolverStack.getCurrent().apply( fullPath );
380-
DynamicFetchBuilderLegacy fetchBuilderLegacy;
380+
LegacyFetchBuilder fetchBuilderLegacy;
381381
if ( explicitFetchBuilder == null ) {
382382
fetchBuilderLegacy = legacyFetchResolver.resolve(
383383
fromClauseAccess.findTableGroup( fetchParent.getNavigablePath() )
@@ -464,7 +464,7 @@ private Consumer<Fetchable> createFetchableConsumer(FetchParent fetchParent, Imm
464464
final String fullPath = currentEntry.getKey();
465465
//noinspection unchecked
466466
FetchBuilder explicitFetchBuilder = (FetchBuilder) fetchBuilderResolverStack.getCurrent().apply( fullPath );
467-
DynamicFetchBuilderLegacy fetchBuilderLegacy;
467+
LegacyFetchBuilder fetchBuilderLegacy;
468468
if ( explicitFetchBuilder == null ) {
469469
fetchBuilderLegacy = legacyFetchResolver.resolve(
470470
fromClauseAccess.findTableGroup( fetchParent.getNavigablePath() )

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
import org.hibernate.metamodel.mapping.BasicValuedMapping;
1212
import org.hibernate.persister.entity.EntityPersister;
1313
import org.hibernate.query.named.NamedResultSetMappingMemento;
14+
import org.hibernate.query.results.LegacyFetchBuilder;
1415
import org.hibernate.query.results.ResultBuilder;
1516
import org.hibernate.query.results.ResultSetMapping;
16-
import org.hibernate.query.results.internal.dynamic.DynamicFetchBuilderLegacy;
1717
import org.hibernate.sql.ast.spi.SqlSelection;
1818
import org.hibernate.sql.results.graph.DomainResult;
1919
import org.hibernate.sql.results.graph.basic.BasicResult;
@@ -44,7 +44,7 @@ public class ResultSetMappingImpl implements ResultSetMapping {
4444
private final String mappingIdentifier;
4545
private final boolean isDynamic;
4646
private List<ResultBuilder> resultBuilders;
47-
private Map<String, Map<String, DynamicFetchBuilderLegacy>> legacyFetchBuilders;
47+
private Map<String, Map<String, LegacyFetchBuilder>> legacyFetchBuilders;
4848

4949
public ResultSetMappingImpl(String mappingIdentifier) {
5050
this( mappingIdentifier, false );
@@ -72,10 +72,10 @@ private ResultSetMappingImpl(ResultSetMappingImpl original) {
7272
this.legacyFetchBuilders = null;
7373
}
7474
else {
75-
final Map<String, Map<String, DynamicFetchBuilderLegacy>> legacyFetchBuilders = new HashMap<>( original.legacyFetchBuilders.size() );
76-
for ( Map.Entry<String, Map<String, DynamicFetchBuilderLegacy>> entry : original.legacyFetchBuilders.entrySet() ) {
77-
final Map<String, DynamicFetchBuilderLegacy> newValue = new HashMap<>( entry.getValue().size() );
78-
for ( Map.Entry<String, DynamicFetchBuilderLegacy> builderEntry : entry.getValue().entrySet() ) {
75+
final Map<String, Map<String, LegacyFetchBuilder>> legacyFetchBuilders = new HashMap<>( original.legacyFetchBuilders.size() );
76+
for ( Map.Entry<String, Map<String, LegacyFetchBuilder>> entry : original.legacyFetchBuilders.entrySet() ) {
77+
final Map<String, LegacyFetchBuilder> newValue = new HashMap<>( entry.getValue().size() );
78+
for ( Map.Entry<String, LegacyFetchBuilder> builderEntry : entry.getValue().entrySet() ) {
7979
newValue.put( builderEntry.getKey(), builderEntry.getValue().cacheKeyInstance() );
8080
}
8181
legacyFetchBuilders.put( entry.getKey(), newValue );
@@ -118,13 +118,13 @@ public void visitResultBuilders(BiConsumer<Integer, ResultBuilder> resultBuilder
118118
}
119119

120120
@Override
121-
public void visitLegacyFetchBuilders(Consumer<DynamicFetchBuilderLegacy> resultBuilderConsumer) {
121+
public void visitLegacyFetchBuilders(Consumer<LegacyFetchBuilder> resultBuilderConsumer) {
122122
if ( legacyFetchBuilders == null ) {
123123
return;
124124
}
125125

126-
for ( Map.Entry<String, Map<String, DynamicFetchBuilderLegacy>> entry : legacyFetchBuilders.entrySet() ) {
127-
for ( DynamicFetchBuilderLegacy fetchBuilder : entry.getValue().values() ) {
126+
for ( Map.Entry<String, Map<String, LegacyFetchBuilder>> entry : legacyFetchBuilders.entrySet() ) {
127+
for ( LegacyFetchBuilder fetchBuilder : entry.getValue().values() ) {
128128
resultBuilderConsumer.accept( fetchBuilder );
129129
}
130130
}
@@ -139,8 +139,8 @@ public void addResultBuilder(ResultBuilder resultBuilder) {
139139
}
140140

141141
@Override
142-
public void addLegacyFetchBuilder(DynamicFetchBuilderLegacy fetchBuilder) {
143-
final Map<String, DynamicFetchBuilderLegacy> existingFetchBuildersByOwner;
142+
public void addLegacyFetchBuilder(LegacyFetchBuilder fetchBuilder) {
143+
final Map<String, LegacyFetchBuilder> existingFetchBuildersByOwner;
144144

145145
if ( legacyFetchBuilders == null ) {
146146
legacyFetchBuilders = new HashMap<>();
@@ -150,7 +150,7 @@ public void addLegacyFetchBuilder(DynamicFetchBuilderLegacy fetchBuilder) {
150150
existingFetchBuildersByOwner = legacyFetchBuilders.get( fetchBuilder.getOwnerAlias() );
151151
}
152152

153-
final Map<String, DynamicFetchBuilderLegacy> fetchBuildersByOwner;
153+
final Map<String, LegacyFetchBuilder> fetchBuildersByOwner;
154154
if ( existingFetchBuildersByOwner == null ) {
155155
fetchBuildersByOwner = new HashMap<>();
156156
legacyFetchBuilders.put( fetchBuilder.getOwnerAlias(), fetchBuildersByOwner );

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping;
1515
import org.hibernate.query.NativeQuery;
1616
import org.hibernate.query.results.FetchBuilder;
17+
import org.hibernate.query.results.LegacyFetchBuilder;
1718
import org.hibernate.query.results.internal.DomainResultCreationStateImpl;
1819
import org.hibernate.query.results.internal.ResultsHelper;
1920
import org.hibernate.spi.NavigablePath;
@@ -41,7 +42,8 @@
4142
* @author Steve Ebersole
4243
* @author Christian Beikov
4344
*/
44-
public class DynamicFetchBuilderLegacy implements DynamicFetchBuilder, NativeQuery.FetchReturn, DynamicFetchBuilderContainer {
45+
public class DynamicFetchBuilderLegacy
46+
implements LegacyFetchBuilder, DynamicFetchBuilder, NativeQuery.FetchReturn, NativeQuery.ReturnableResultNode, DynamicFetchBuilderContainer {
4547

4648
private static final String ELEMENT_PREFIX = CollectionPart.Nature.ELEMENT.getName() + ".";
4749
private static final String INDEX_PREFIX = CollectionPart.Nature.INDEX.getName() + ".";

0 commit comments

Comments
 (0)