1010
1111import org .hibernate .LockMode ;
1212import 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 ;
1514import org .hibernate .engine .spi .EntityEntry ;
1615import org .hibernate .engine .spi .EntityKey ;
1716import org .hibernate .engine .spi .PersistenceContext ;
1817import org .hibernate .engine .spi .SessionFactoryImplementor ;
19- import org .hibernate .engine .spi .SubselectFetch ;
2018import org .hibernate .event .spi .EventSource ;
2119import org .hibernate .event .spi .LoadEvent ;
2220import org .hibernate .event .spi .LoadEventListener ;
2826import org .hibernate .metamodel .mapping .EntityMappingType ;
2927import org .hibernate .metamodel .mapping .JdbcMapping ;
3028import org .hibernate .query .spi .QueryOptions ;
29+ import org .hibernate .sql .ast .SqlAstTranslatorFactory ;
3130import org .hibernate .sql .ast .tree .expression .JdbcParameter ;
3231import org .hibernate .sql .ast .tree .select .SelectStatement ;
3332import org .hibernate .sql .exec .internal .JdbcParameterBindingImpl ;
3635import org .hibernate .sql .exec .spi .JdbcOperationQuerySelect ;
3736import org .hibernate .sql .exec .spi .JdbcParameterBindings ;
3837import org .hibernate .sql .exec .spi .JdbcParametersList ;
38+ import org .hibernate .sql .exec .spi .JdbcSelectExecutor ;
3939import org .hibernate .sql .results .internal .RowTransformerStandardImpl ;
4040import org .hibernate .sql .results .spi .ManagedResultConsumer ;
4141
4242import org .checkerframework .checker .nullness .qual .NonNull ;
4343import org .hibernate .type .descriptor .java .JavaType ;
4444
4545import static java .lang .Boolean .TRUE ;
46+ import static org .hibernate .engine .internal .BatchFetchQueueHelper .removeBatchLoadableEntityKey ;
47+ import static org .hibernate .engine .spi .SubselectFetch .createRegistrationHandler ;
4648import static org .hibernate .internal .util .collections .CollectionHelper .isEmpty ;
4749import 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 */
5259public 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