Skip to content

Commit 10c83d8

Browse files
committed
further cleanups on multi id loaders
Signed-off-by: Gavin King <[email protected]>
1 parent 6c5f577 commit 10c83d8

File tree

4 files changed

+164
-164
lines changed

4 files changed

+164
-164
lines changed

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

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,27 @@
66

77
import org.hibernate.LockMode;
88
import org.hibernate.LockOptions;
9+
import org.hibernate.engine.jdbc.spi.JdbcServices;
910
import org.hibernate.engine.spi.EntityKey;
1011
import org.hibernate.engine.spi.SessionFactoryImplementor;
1112
import org.hibernate.event.spi.EventSource;
1213
import org.hibernate.event.spi.LoadEvent;
1314
import org.hibernate.event.spi.LoadEventListener;
14-
import org.hibernate.internal.util.collections.CollectionHelper;
1515
import org.hibernate.loader.ast.spi.MultiIdEntityLoader;
1616
import org.hibernate.loader.ast.spi.MultiIdLoadOptions;
1717
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
1818
import org.hibernate.metamodel.mapping.EntityMappingType;
19+
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
20+
import org.hibernate.sql.exec.spi.JdbcSelectExecutor;
1921
import org.hibernate.type.descriptor.java.JavaType;
2022

2123
import java.util.ArrayList;
2224
import java.util.List;
2325

26+
import static org.hibernate.internal.util.collections.CollectionHelper.arrayList;
2427
import static org.hibernate.loader.ast.internal.CacheEntityLoaderHelper.loadFromSessionCacheStatic;
28+
import static org.hibernate.loader.ast.internal.LoaderHelper.getReadOnlyFromLoadQueryInfluencers;
29+
import static org.hibernate.loader.ast.internal.MultiKeyLoadLogging.MULTI_KEY_LOAD_LOGGER;
2530

2631
/**
2732
* Base support for {@link MultiIdEntityLoader} implementations.
@@ -51,6 +56,18 @@ public EntityIdentifierMapping getIdentifierMapping() {
5156
return identifierMapping;
5257
}
5358

59+
protected JdbcServices getJdbcServices() {
60+
return getSessionFactory().getJdbcServices();
61+
}
62+
63+
protected SqlAstTranslatorFactory getSqlAstTranslatorFactory() {
64+
return getJdbcServices().getJdbcEnvironment().getSqlAstTranslatorFactory();
65+
}
66+
67+
protected JdbcSelectExecutor getJdbcSelectExecutor() {
68+
return getJdbcServices().getJdbcSelectExecutor();
69+
}
70+
5471
@Override
5572
public EntityMappingType getLoadable() {
5673
return getEntityDescriptor();
@@ -71,9 +88,8 @@ protected List<T> performOrderedMultiLoad(
7188
Object[] ids,
7289
MultiIdLoadOptions loadOptions,
7390
EventSource session) {
74-
if ( MultiKeyLoadLogging.MULTI_KEY_LOAD_LOGGER.isTraceEnabled() ) {
75-
MultiKeyLoadLogging.MULTI_KEY_LOAD_LOGGER.tracef( "#performOrderedMultiLoad(`%s`, ..)",
76-
getLoadable().getEntityName() );
91+
if ( MULTI_KEY_LOAD_LOGGER.isTraceEnabled() ) {
92+
MULTI_KEY_LOAD_LOGGER.tracef( "#performOrderedMultiLoad(`%s`, ..)", getLoadable().getEntityName() );
7793
}
7894

7995
assert loadOptions.isOrderReturnEnabled();
@@ -87,7 +103,7 @@ protected List<T> performOrderedMultiLoad(
87103

88104
final int maxBatchSize = maxBatchSize( ids, loadOptions );
89105

90-
final List<Object> result = CollectionHelper.arrayList( ids.length );
106+
final List<Object> result = arrayList( ids.length );
91107

92108
final List<Object> idsInBatch = new ArrayList<>();
93109
final List<Integer> elementPositionsLoadedByBatch = new ArrayList<>();
@@ -146,7 +162,7 @@ protected boolean loadFromCaches(
146162
getLoadable().getJavaType().getJavaTypeClass().getName(),
147163
lockOptions,
148164
session,
149-
LoaderHelper.getReadOnlyFromLoadQueryInfluencers( session )
165+
getReadOnlyFromLoadQueryInfluencers( session )
150166
);
151167

152168
Object managedEntity = null;

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

Lines changed: 44 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,11 @@
1010

1111
import org.hibernate.LockMode;
1212
import org.hibernate.LockOptions;
13-
import org.hibernate.engine.internal.BatchFetchQueueHelper;
14-
import org.hibernate.engine.spi.BatchFetchQueue;
13+
import org.hibernate.engine.jdbc.spi.JdbcServices;
1514
import org.hibernate.engine.spi.EntityEntry;
1615
import org.hibernate.engine.spi.EntityKey;
1716
import org.hibernate.engine.spi.PersistenceContext;
1817
import org.hibernate.engine.spi.SessionFactoryImplementor;
19-
import org.hibernate.engine.spi.SubselectFetch;
2018
import org.hibernate.event.spi.EventSource;
2119
import org.hibernate.event.spi.LoadEvent;
2220
import org.hibernate.event.spi.LoadEventListener;
@@ -28,6 +26,7 @@
2826
import org.hibernate.metamodel.mapping.EntityMappingType;
2927
import org.hibernate.metamodel.mapping.JdbcMapping;
3028
import org.hibernate.query.spi.QueryOptions;
29+
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
3130
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
3231
import org.hibernate.sql.ast.tree.select.SelectStatement;
3332
import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl;
@@ -36,29 +35,37 @@
3635
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
3736
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
3837
import org.hibernate.sql.exec.spi.JdbcParametersList;
38+
import org.hibernate.sql.exec.spi.JdbcSelectExecutor;
3939
import org.hibernate.sql.results.internal.RowTransformerStandardImpl;
4040
import org.hibernate.sql.results.spi.ManagedResultConsumer;
4141

4242
import org.checkerframework.checker.nullness.qual.NonNull;
4343
import org.hibernate.type.descriptor.java.JavaType;
4444

4545
import static java.lang.Boolean.TRUE;
46+
import static org.hibernate.engine.internal.BatchFetchQueueHelper.removeBatchLoadableEntityKey;
47+
import static org.hibernate.engine.spi.SubselectFetch.createRegistrationHandler;
4648
import static org.hibernate.internal.util.collections.CollectionHelper.isEmpty;
4749
import static org.hibernate.loader.ast.internal.CacheEntityLoaderHelper.loadFromSessionCacheStatic;
50+
import static org.hibernate.loader.ast.internal.LoaderHelper.getReadOnlyFromLoadQueryInfluencers;
51+
import static org.hibernate.loader.ast.internal.LoaderHelper.loadByArrayParameter;
52+
import static org.hibernate.loader.ast.internal.LoaderSelectBuilder.createSelectBySingleArrayParameter;
53+
import static org.hibernate.loader.ast.internal.MultiKeyLoadHelper.resolveArrayJdbcMapping;
54+
import static org.hibernate.sql.exec.spi.JdbcParameterBindings.NO_BINDINGS;
4855

4956
/**
5057
* @author Steve Ebersole
5158
*/
5259
public class MultiIdEntityLoaderArrayParam<E> extends AbstractMultiIdEntityLoader<E> implements SqlArrayMultiKeyLoader {
5360
private final JdbcMapping arrayJdbcMapping;
5461
private final JdbcParameter jdbcParameter;
55-
private final int idJdbcTypeCount;
5662

57-
public MultiIdEntityLoaderArrayParam(EntityMappingType entityDescriptor, int identifierColumnSpan, SessionFactoryImplementor sessionFactory) {
63+
public MultiIdEntityLoaderArrayParam(
64+
EntityMappingType entityDescriptor,
65+
SessionFactoryImplementor sessionFactory) {
5866
super( entityDescriptor, sessionFactory );
59-
this.idJdbcTypeCount = identifierColumnSpan;
6067
final Class<?> arrayClass = createTypedArray( 0 ).getClass();
61-
arrayJdbcMapping = MultiKeyLoadHelper.resolveArrayJdbcMapping(
68+
arrayJdbcMapping = resolveArrayJdbcMapping(
6269
getSessionFactory().getTypeConfiguration().getBasicTypeRegistry().getRegisteredType( arrayClass ),
6370
getIdentifierMapping().getJdbcMapping(),
6471
arrayClass,
@@ -83,7 +90,7 @@ protected void handleResults(
8390
// the element value at this position in the result List should be
8491
// the EntityKey for that entity - reuse it
8592
final EntityKey entityKey = (EntityKey) result.get( position );
86-
BatchFetchQueueHelper.removeBatchLoadableEntityKey( entityKey, session );
93+
removeBatchLoadableEntityKey( entityKey, session );
8794
Object entity = persistenceContext.getEntity( entityKey );
8895
if ( entity != null && !loadOptions.isReturnOfDeletedEntitiesEnabled() ) {
8996
// make sure it is not DELETED
@@ -102,71 +109,52 @@ protected void handleResults(
102109

103110
@Override
104111
protected int maxBatchSize(Object[] ids, MultiIdLoadOptions loadOptions) {
105-
if ( loadOptions.getBatchSize() != null && loadOptions.getBatchSize() > 0 ) {
106-
return loadOptions.getBatchSize();
107-
}
108-
else {
109-
// disable batching by default
110-
return ids.length;
111-
// return getSessionFactory().getJdbcServices().getJdbcEnvironment().getDialect()
112-
// .getBatchLoadSizingStrategy().determineOptimalBatchLoadSize(
113-
// idJdbcTypeCount,
114-
// ids.length,
115-
// getSessionFactory().getSessionFactoryOptions().inClauseParameterPaddingEnabled()
116-
// );
117-
}
112+
final Integer explicitBatchSize = loadOptions.getBatchSize();
113+
return explicitBatchSize != null && explicitBatchSize > 0
114+
? explicitBatchSize
115+
// disable batching by default
116+
: ids.length;
118117
}
119118

120119
@Override
121120
protected void loadEntitiesById(
122-
List<Object> idsToLoadFromDatabase,
121+
List<Object> idsInBatch,
123122
LockOptions lockOptions,
124123
MultiIdLoadOptions loadOptions,
125124
EventSource session) {
126-
final SelectStatement sqlAst = LoaderSelectBuilder.createSelectBySingleArrayParameter(
125+
final SelectStatement sqlAst = createSelectBySingleArrayParameter(
127126
getLoadable(),
128127
getIdentifierMapping(),
129128
session.getLoadQueryInfluencers(),
130129
lockOptions,
131130
jdbcParameter,
132131
getSessionFactory()
133132
);
134-
final JdbcOperationQuerySelect jdbcSelectOperation = getSessionFactory().getJdbcServices()
135-
.getJdbcEnvironment()
136-
.getSqlAstTranslatorFactory()
137-
.buildSelectTranslator( getSessionFactory(), sqlAst )
138-
.translate( JdbcParameterBindings.NO_BINDINGS, QueryOptions.NONE );
139133

140134
final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl(1);
141-
jdbcParameterBindings.addBinding(
142-
jdbcParameter,
143-
new JdbcParameterBindingImpl( arrayJdbcMapping, idsToLoadFromDatabase.toArray( createTypedArray(0 ) ) )
144-
);
145-
146-
final PersistenceContext persistenceContext = session.getPersistenceContext();
147-
final BatchFetchQueue batchFetchQueue = persistenceContext.getBatchFetchQueue();
135+
jdbcParameterBindings.addBinding( jdbcParameter,
136+
new JdbcParameterBindingImpl( arrayJdbcMapping, idsInBatch.toArray( createTypedArray(0) ) ) );
148137

149-
final SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler = SubselectFetch.createRegistrationHandler(
150-
batchFetchQueue,
151-
sqlAst,
152-
JdbcParametersList.singleton( jdbcParameter ),
153-
jdbcParameterBindings
154-
);
155-
156-
session.getJdbcServices().getJdbcSelectExecutor().executeQuery(
157-
jdbcSelectOperation,
138+
getJdbcSelectExecutor().executeQuery(
139+
getSqlAstTranslatorFactory().buildSelectTranslator( getSessionFactory(), sqlAst )
140+
.translate( NO_BINDINGS, QueryOptions.NONE ),
158141
jdbcParameterBindings,
159-
new ExecutionContextWithSubselectFetchHandler( session,
160-
subSelectFetchableKeysHandler,
142+
new ExecutionContextWithSubselectFetchHandler(
143+
session,
144+
createRegistrationHandler(
145+
session.getPersistenceContext().getBatchFetchQueue(),
146+
sqlAst,
147+
JdbcParametersList.singleton( jdbcParameter ),
148+
jdbcParameterBindings
149+
),
161150
TRUE.equals( loadOptions.getReadOnly( session ) ) ),
162151
RowTransformerStandardImpl.instance(),
163152
null,
164-
idsToLoadFromDatabase.size(),
153+
idsInBatch.size(),
165154
ManagedResultConsumer.INSTANCE
166155
);
167156
}
168157

169-
170158
@Override
171159
protected <K> List<E> performUnorderedMultiLoad(
172160
K[] ids,
@@ -180,7 +168,7 @@ protected <K> List<E> performUnorderedMultiLoad(
180168
}
181169

182170
final List<E> result = CollectionHelper.arrayList( ids.length );
183-
final LockOptions lockOptions = (loadOptions.getLockOptions() == null)
171+
final LockOptions lockOptions = loadOptions.getLockOptions() == null
184172
? new LockOptions( LockMode.NONE )
185173
: loadOptions.getLockOptions();
186174

@@ -198,21 +186,19 @@ protected <K> List<E> performUnorderedMultiLoad(
198186
return result;
199187
}
200188

201-
final SelectStatement sqlAst = LoaderSelectBuilder.createSelectBySingleArrayParameter(
189+
final SelectStatement sqlAst = createSelectBySingleArrayParameter(
202190
getLoadable(),
203191
getIdentifierMapping(),
204192
session.getLoadQueryInfluencers(),
205193
lockOptions,
206194
jdbcParameter,
207195
getSessionFactory()
208196
);
209-
final JdbcOperationQuerySelect jdbcSelectOperation = getSessionFactory().getJdbcServices()
210-
.getJdbcEnvironment()
211-
.getSqlAstTranslatorFactory()
212-
.buildSelectTranslator( getSessionFactory(), sqlAst )
213-
.translate( JdbcParameterBindings.NO_BINDINGS, QueryOptions.NONE );
197+
final JdbcOperationQuerySelect jdbcSelectOperation =
198+
getSqlAstTranslatorFactory().buildSelectTranslator( getSessionFactory(), sqlAst )
199+
.translate( NO_BINDINGS, QueryOptions.NONE );
214200

215-
final List<E> databaseResults = LoaderHelper.loadByArrayParameter(
201+
final List<E> databaseResults = loadByArrayParameter(
216202
idsToLoadFromDatabase,
217203
sqlAst,
218204
jdbcSelectOperation,
@@ -236,7 +222,7 @@ protected <K> List<E> performUnorderedMultiLoad(
236222
continue;
237223
}
238224
// found or not, remove the key from the batch-fetch queue
239-
BatchFetchQueueHelper.removeBatchLoadableEntityKey( id, getLoadable(), session );
225+
removeBatchLoadableEntityKey( id, getLoadable(), session );
240226
}
241227

242228
return result;
@@ -272,7 +258,7 @@ protected final <R,K> K[] processResolvableEntities(
272258
getLoadable().getJavaType().getJavaTypeClass().getName(),
273259
lockOptions,
274260
session,
275-
LoaderHelper.getReadOnlyFromLoadQueryInfluencers( session )
261+
getReadOnlyFromLoadQueryInfluencers( session )
276262
);
277263

278264
Object managedEntity = null;

0 commit comments

Comments
 (0)