Skip to content

Commit 1d7b815

Browse files
committed
HHH-18855: Suggested fix for ticket
1 parent 3cf6081 commit 1d7b815

File tree

2 files changed

+51
-78
lines changed

2 files changed

+51
-78
lines changed

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

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1010
import org.hibernate.engine.spi.SubselectFetch;
1111
import org.hibernate.metamodel.mapping.EntityMappingType;
12+
import org.hibernate.query.internal.SimpleQueryOptions;
1213
import org.hibernate.query.spi.QueryOptions;
13-
import org.hibernate.query.spi.QueryOptionsAdapter;
1414
import org.hibernate.sql.exec.internal.BaseExecutionContext;
15+
import org.hibernate.sql.exec.spi.Callback;
1516

1617
/**
1718
* @author Steve Ebersole
@@ -23,6 +24,7 @@ class SingleIdExecutionContext extends BaseExecutionContext {
2324
private final Boolean readOnly;
2425
private final LockOptions lockOptions;
2526
private final SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler;
27+
private final Callback callback;
2628

2729
public SingleIdExecutionContext(
2830
Object entityId,
@@ -32,13 +34,35 @@ public SingleIdExecutionContext(
3234
LockOptions lockOptions,
3335
SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler,
3436
SharedSessionContractImplementor session) {
37+
this(
38+
entityId,
39+
entityInstance,
40+
rootEntityDescriptor,
41+
readOnly,
42+
lockOptions,
43+
subSelectFetchableKeysHandler,
44+
session,
45+
null
46+
);
47+
}
48+
49+
public SingleIdExecutionContext(
50+
Object entityId,
51+
Object entityInstance,
52+
EntityMappingType rootEntityDescriptor,
53+
Boolean readOnly,
54+
LockOptions lockOptions,
55+
SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler,
56+
SharedSessionContractImplementor session,
57+
Callback callback) {
3558
super( session );
3659
this.entityInstance = entityInstance;
3760
this.entityId = entityId;
3861
this.rootEntityDescriptor = rootEntityDescriptor;
3962
this.readOnly = readOnly;
4063
this.lockOptions = lockOptions;
4164
this.subSelectFetchableKeysHandler = subSelectFetchableKeysHandler;
65+
this.callback = callback;
4266
}
4367

4468
@Override
@@ -58,22 +82,16 @@ public EntityMappingType getRootEntityDescriptor() {
5882

5983
@Override
6084
public QueryOptions getQueryOptions() {
61-
return new QueryOptionsAdapter() {
62-
@Override
63-
public Boolean isReadOnly() {
64-
return readOnly;
65-
}
66-
67-
@Override
68-
public LockOptions getLockOptions() {
69-
return lockOptions;
70-
}
71-
};
85+
return new SimpleQueryOptions( lockOptions, readOnly );
7286
}
7387

7488
@Override
7589
public void registerLoadingEntityHolder(EntityHolder holder) {
7690
subSelectFetchableKeysHandler.addKey( holder );
7791
}
7892

93+
@Override
94+
public Callback getCallback() {
95+
return callback;
96+
}
7997
}

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

Lines changed: 21 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,18 @@
44
*/
55
package org.hibernate.loader.ast.internal;
66

7-
import java.util.List;
8-
97
import org.hibernate.LockOptions;
108
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
119
import org.hibernate.engine.jdbc.spi.JdbcServices;
1210
import org.hibernate.engine.spi.SessionFactoryImplementor;
1311
import org.hibernate.engine.spi.SharedSessionContractImplementor;
12+
import org.hibernate.engine.spi.SubselectFetch;
1413
import org.hibernate.loader.ast.spi.Loadable;
1514
import org.hibernate.metamodel.mapping.EntityMappingType;
1615
import org.hibernate.metamodel.mapping.ModelPart;
1716
import org.hibernate.query.internal.SimpleQueryOptions;
18-
import org.hibernate.query.spi.QueryOptions;
19-
import org.hibernate.query.spi.QueryOptionsAdapter;
2017
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
2118
import org.hibernate.sql.ast.tree.select.SelectStatement;
22-
import org.hibernate.sql.exec.internal.BaseExecutionContext;
2319
import org.hibernate.sql.exec.internal.CallbackImpl;
2420
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
2521
import org.hibernate.sql.exec.spi.Callback;
@@ -30,19 +26,21 @@
3026
import org.hibernate.sql.results.spi.ListResultsConsumer;
3127
import org.hibernate.sql.results.spi.RowTransformer;
3228

29+
import java.util.List;
30+
3331
/**
3432
* Describes a plan for loading an entity by identifier.
3533
*
36-
* @implNote Made up of (1) a SQL AST for the SQL SELECT and (2) the `ModelPart` used as the restriction
37-
*
3834
* @author Steve Ebersole
35+
* @implNote Made up of (1) a SQL AST for the SQL SELECT and (2) the `ModelPart` used as the restriction
3936
*/
4037
// todo (6.0) : this can generically define a load-by-uk as well.
4138
// only the SQL AST and `restrictivePart` vary and they are passed as constructor args
4239
public class SingleIdLoadPlan<T> implements SingleEntityLoadPlan {
4340
private final EntityMappingType entityMappingType;
4441
private final ModelPart restrictivePart;
4542
private final LockOptions lockOptions;
43+
private final SelectStatement sqlAst;
4644
private final JdbcOperationQuerySelect jdbcSelect;
4745
private final JdbcParametersList jdbcParameters;
4846

@@ -57,18 +55,14 @@ public SingleIdLoadPlan(
5755
this.restrictivePart = restrictivePart;
5856
this.lockOptions = lockOptions.makeCopy();
5957
this.jdbcParameters = jdbcParameters;
58+
this.sqlAst = sqlAst;
6059
final JdbcServices jdbcServices = sessionFactory.getJdbcServices();
6160
final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment();
6261
final SqlAstTranslatorFactory sqlAstTranslatorFactory = jdbcEnvironment.getSqlAstTranslatorFactory();
6362
this.jdbcSelect = sqlAstTranslatorFactory.buildSelectTranslator( sessionFactory, sqlAst )
6463
.translate(
6564
null,
66-
new QueryOptionsAdapter() {
67-
@Override
68-
public LockOptions getLockOptions() {
69-
return lockOptions;
70-
}
71-
}
65+
new SimpleQueryOptions( lockOptions, null )
7266
);
7367
}
7468

@@ -137,23 +131,32 @@ public T load(
137131
);
138132
}
139133
assert offset == jdbcParameters.size();
140-
final QueryOptions queryOptions = new SimpleQueryOptions( lockOptions, readOnly );
141134
final Callback callback = new CallbackImpl();
135+
final SubselectFetch.RegistrationHandler subselectRegistrationHandler = SubselectFetch.createRegistrationHandler(
136+
session.getPersistenceContextInternal().getBatchFetchQueue(),
137+
sqlAst,
138+
jdbcParameters,
139+
jdbcParameterBindings
140+
);
142141

143142
final List<T> list = session.getJdbcServices().getJdbcSelectExecutor().list(
144143
jdbcSelect,
145144
jdbcParameterBindings,
146145
new SingleIdExecutionContext(
147-
session,
148-
entityInstance,
149146
restrictedValue,
147+
entityInstance,
150148
entityMappingType.getRootEntityDescriptor(),
151-
queryOptions,
149+
readOnly,
150+
lockOptions,
151+
subselectRegistrationHandler,
152+
session,
152153
callback
153154
),
154155
getRowTransformer(),
155156
null,
156-
singleResultExpected ? ListResultsConsumer.UniqueSemantic.ASSERT : ListResultsConsumer.UniqueSemantic.FILTER,
157+
singleResultExpected ?
158+
ListResultsConsumer.UniqueSemantic.ASSERT :
159+
ListResultsConsumer.UniqueSemantic.FILTER,
157160
1
158161
);
159162

@@ -165,52 +168,4 @@ public T load(
165168
callback.invokeAfterLoadActions( entity, entityMappingType, session );
166169
return entity;
167170
}
168-
169-
private static class SingleIdExecutionContext extends BaseExecutionContext {
170-
private final Object entityInstance;
171-
private final Object restrictedValue;
172-
private final EntityMappingType rootEntityDescriptor;
173-
private final QueryOptions queryOptions;
174-
private final Callback callback;
175-
176-
public SingleIdExecutionContext(
177-
SharedSessionContractImplementor session,
178-
Object entityInstance,
179-
Object restrictedValue,
180-
EntityMappingType rootEntityDescriptor, QueryOptions queryOptions,
181-
Callback callback) {
182-
super( session );
183-
this.entityInstance = entityInstance;
184-
this.restrictedValue = restrictedValue;
185-
this.rootEntityDescriptor = rootEntityDescriptor;
186-
this.queryOptions = queryOptions;
187-
this.callback = callback;
188-
}
189-
190-
@Override
191-
public Object getEntityInstance() {
192-
return entityInstance;
193-
}
194-
195-
@Override
196-
public Object getEntityId() {
197-
return restrictedValue;
198-
}
199-
200-
@Override
201-
public EntityMappingType getRootEntityDescriptor() {
202-
return rootEntityDescriptor;
203-
}
204-
205-
@Override
206-
public QueryOptions getQueryOptions() {
207-
return queryOptions;
208-
}
209-
210-
@Override
211-
public Callback getCallback() {
212-
return callback;
213-
}
214-
215-
}
216171
}

0 commit comments

Comments
 (0)