Skip to content

Commit 18079f3

Browse files
committed
HHH-8276 - Integrate LoadPlans into UniqueEntityLoader (PoC) - Initial reworking to remove SQL references (for reuse in Search, OGM, etc) and to split out conceptual "from clause" and "select clause" into different structures (see QuerySpaces)
1 parent dc7cdf9 commit 18079f3

File tree

113 files changed

+7011
-1622
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+7011
-1622
lines changed

hibernate-core/src/main/java/org/hibernate/loader/entity/plan/AbstractLoadPlanBasedEntityLoader.java

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,11 @@
3232
import org.hibernate.loader.entity.UniqueEntityLoader;
3333
import org.hibernate.loader.plan.exec.query.spi.NamedParameterContext;
3434
import org.hibernate.loader.plan.exec.query.spi.QueryBuildingParameters;
35-
import org.hibernate.loader.plan.exec.spi.LoadQueryDetails;
35+
import org.hibernate.loader.plan.exec.spi.EntityLoadQueryDetails;
3636
import org.hibernate.loader.plan.internal.SingleRootReturnLoadPlanBuilderStrategy;
3737
import org.hibernate.loader.plan.spi.LoadPlan;
38-
import org.hibernate.loader.plan.spi.build.LoadPlanBuilder;
38+
import org.hibernate.loader.plan.spi.build.MetadataDrivenLoadPlanBuilder;
3939
import org.hibernate.loader.spi.AfterLoadAction;
40-
import org.hibernate.loader.spi.NoOpLoadPlanAdvisor;
4140
import org.hibernate.persister.entity.EntityPersister;
4241
import org.hibernate.persister.entity.OuterJoinLoadable;
4342
import org.hibernate.pretty.MessageHelper;
@@ -58,7 +57,7 @@ public abstract class AbstractLoadPlanBasedEntityLoader implements UniqueEntityL
5857
private final String entityName;
5958

6059
private final LoadPlan plan;
61-
private final LoadQueryDetails staticLoadQuery;
60+
private final EntityLoadQueryDetails staticLoadQuery;
6261

6362
private ColumnNameCache columnNameCache;
6463

@@ -78,20 +77,20 @@ public AbstractLoadPlanBasedEntityLoader(
7877
buildingParameters.getQueryInfluencers()
7978
);
8079

81-
this.plan = LoadPlanBuilder.buildRootEntityLoadPlan( strategy, entityPersister );
82-
this.staticLoadQuery = LoadQueryDetails.makeForBatching(
83-
uniqueKeyColumnNames,
80+
this.plan = MetadataDrivenLoadPlanBuilder.buildRootEntityLoadPlan( strategy, entityPersister );
81+
this.staticLoadQuery = EntityLoadQueryDetails.makeForBatching(
8482
plan,
85-
factory,
86-
buildingParameters
83+
uniqueKeyColumnNames,
84+
buildingParameters,
85+
factory
8786
);
8887
}
8988

9089
protected SessionFactoryImplementor getFactory() {
9190
return factory;
9291
}
9392

94-
protected LoadQueryDetails getStaticLoadQuery() {
93+
protected EntityLoadQueryDetails getStaticLoadQuery() {
9594
return staticLoadQuery;
9695
}
9796

@@ -197,7 +196,7 @@ public Object load(Serializable id, Object optionalObject, SessionImplementor se
197196
protected List executeLoad(
198197
SessionImplementor session,
199198
QueryParameters queryParameters,
200-
LoadQueryDetails loadQueryDetails,
199+
EntityLoadQueryDetails loadQueryDetails,
201200
boolean returnProxies,
202201
ResultTransformer forcedResultTransformer) throws SQLException {
203202
final List<AfterLoadAction> afterLoadActions = new ArrayList<AfterLoadAction>();
@@ -214,7 +213,7 @@ protected List executeLoad(
214213
protected List executeLoad(
215214
SessionImplementor session,
216215
QueryParameters queryParameters,
217-
LoadQueryDetails loadQueryDetails,
216+
EntityLoadQueryDetails loadQueryDetails,
218217
boolean returnProxies,
219218
ResultTransformer forcedResultTransformer,
220219
List<AfterLoadAction> afterLoadActions) throws SQLException {
@@ -237,8 +236,6 @@ protected List executeLoad(
237236
try {
238237
final SqlStatementWrapper wrapper = executeQueryStatement( sql, queryParameters, false, afterLoadActions, session );
239238
results = loadQueryDetails.getResultSetProcessor().extractResults(
240-
// todo : hook in the JPA 2.1 entity graph advisor
241-
NoOpLoadPlanAdvisor.INSTANCE,
242239
wrapper.getResultSet(),
243240
session,
244241
queryParameters,
@@ -248,7 +245,6 @@ public int[] getNamedParameterLocations(String name) {
248245
return AbstractLoadPlanBasedEntityLoader.this.getNamedParameterLocs( name );
249246
}
250247
},
251-
loadQueryDetails.getAliasResolutionContext(),
252248
returnProxies,
253249
queryParameters.isReadOnly(),
254250
forcedResultTransformer,
@@ -295,7 +291,7 @@ else if ( results.size() == 1 ) {
295291
protected Object doQueryAndLoadEntity(
296292
SessionImplementor session,
297293
QueryParameters queryParameters,
298-
LoadQueryDetails loadQueryDetails,
294+
EntityLoadQueryDetails loadQueryDetails,
299295
boolean returnProxies,
300296
ResultTransformer forcedResultTransformer) throws SQLException {
301297

@@ -305,7 +301,6 @@ protected Object doQueryAndLoadEntity(
305301

306302
try {
307303
final List results = loadQueryDetails.getResultSetProcessor().extractResults(
308-
NoOpLoadPlanAdvisor.INSTANCE,
309304
wrapper.getResultSet(),
310305
session,
311306
queryParameters,
@@ -315,7 +310,6 @@ public int[] getNamedParameterLocations(String name) {
315310
return AbstractLoadPlanBasedEntityLoader.this.getNamedParameterLocs( name );
316311
}
317312
},
318-
loadQueryDetails.getAliasResolutionContext(),
319313
returnProxies,
320314
queryParameters.isReadOnly(),
321315
forcedResultTransformer,
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
5+
* indicated by the @author tags or express copyright attribution
6+
* statements applied by the authors. All third-party contributions are
7+
* distributed under license by Red Hat Inc.
8+
*
9+
* This copyrighted material is made available to anyone wishing to use, modify,
10+
* copy, or redistribute it subject to the terms and conditions of the GNU
11+
* Lesser General Public License, as published by the Free Software Foundation.
12+
*
13+
* This program is distributed in the hope that it will be useful,
14+
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15+
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
16+
* for more details.
17+
*
18+
* You should have received a copy of the GNU Lesser General Public License
19+
* along with this distribution; if not, write to:
20+
* Free Software Foundation, Inc.
21+
* 51 Franklin Street, Fifth Floor
22+
* Boston, MA 02110-1301 USA
23+
*/
24+
package org.hibernate.loader.plan.exec.internal;
25+
26+
import org.hibernate.loader.plan.spi.LoadPlan;
27+
import org.hibernate.loader.plan.spi.Return;
28+
29+
/**
30+
* @author Steve Ebersole
31+
*/
32+
public class Helper {
33+
/**
34+
* Singleton access
35+
*/
36+
public static final Helper INSTANCE = new Helper();
37+
38+
/**
39+
* Disallow direct instantiation
40+
*/
41+
private Helper() {
42+
}
43+
44+
45+
/**
46+
* Extract the root return of the LoadPlan, assuming there is just one.
47+
*
48+
* @param loadPlan The LoadPlan from which to extract the root return
49+
* @param returnType The Return type expected, passed as an argument
50+
* @param <T> The parameterized type of the specific Return type expected
51+
*
52+
* @return The root Return
53+
*
54+
* @throws IllegalStateException If there is no root, more than one root or the single root
55+
* is not of the expected type.
56+
*/
57+
@SuppressWarnings("unchecked")
58+
public <T extends Return> T extractRootReturn(LoadPlan loadPlan, Class<T> returnType) {
59+
if ( loadPlan.getReturns().size() == 0 ) {
60+
throw new IllegalStateException( "LoadPlan contained no root returns" );
61+
}
62+
else if ( loadPlan.getReturns().size() > 1 ) {
63+
throw new IllegalStateException( "LoadPlan contained more than one root returns" );
64+
}
65+
66+
final Return rootReturn = loadPlan.getReturns().get( 0 );
67+
if ( !returnType.isInstance( rootReturn ) ) {
68+
throw new IllegalStateException(
69+
String.format(
70+
"Unexpected LoadPlan root return; expecting %s, but found %s",
71+
returnType.getName(),
72+
rootReturn.getClass().getName()
73+
)
74+
);
75+
}
76+
77+
return (T) rootReturn;
78+
}
79+
}

0 commit comments

Comments
 (0)