12
12
import org .hibernate .SharedSessionContract ;
13
13
import org .hibernate .cache .spi .QueryKey ;
14
14
import org .hibernate .cache .spi .QueryResultsCache ;
15
+ import org .hibernate .engine .spi .LoadQueryInfluencers ;
15
16
import org .hibernate .engine .spi .PersistenceContext ;
16
17
import org .hibernate .engine .spi .SessionFactoryImplementor ;
17
18
import org .hibernate .engine .spi .SharedSessionContractImplementor ;
18
- import org .hibernate .internal .util .collections .ArrayHelper ;
19
19
import org .hibernate .query .TupleTransformer ;
20
20
import org .hibernate .query .spi .QueryOptions ;
21
21
import org .hibernate .sql .exec .SqlExecLogger ;
28
28
import org .hibernate .sql .results .internal .RowProcessingStateStandardImpl ;
29
29
import org .hibernate .sql .results .internal .RowTransformerStandardImpl ;
30
30
import org .hibernate .sql .results .internal .RowTransformerTupleTransformerAdapter ;
31
+ import org .hibernate .sql .results .jdbc .internal .AbstractJdbcValues ;
31
32
import org .hibernate .sql .results .jdbc .internal .CachedJdbcValuesMetadata ;
32
33
import org .hibernate .sql .results .jdbc .internal .DeferredResultSetAccess ;
33
34
import org .hibernate .sql .results .jdbc .internal .JdbcValuesCacheHit ;
48
49
import org .hibernate .type .spi .TypeConfiguration ;
49
50
50
51
import static org .hibernate .internal .util .NullnessHelper .coalesceSuppliedValues ;
52
+ import static org .hibernate .internal .util .collections .ArrayHelper .indexOf ;
51
53
52
54
/**
53
55
* Standard JdbcSelectExecutor implementation used by Hibernate,
@@ -145,22 +147,7 @@ private <T, R> T doExecuteQuery(
145
147
);
146
148
147
149
if ( rowTransformer == null ) {
148
- @ SuppressWarnings ("unchecked" )
149
- final TupleTransformer <R > tupleTransformer = (TupleTransformer <R >) executionContext
150
- .getQueryOptions ()
151
- .getTupleTransformer ();
152
-
153
- if ( tupleTransformer == null ) {
154
- rowTransformer = RowTransformerStandardImpl .instance ();
155
- }
156
- else {
157
- final List <DomainResult <?>> domainResults = jdbcValues .getValuesMapping ().getDomainResults ();
158
- final String [] aliases = new String [domainResults .size ()];
159
- for ( int i = 0 ; i < domainResults .size (); i ++ ) {
160
- aliases [i ] = domainResults .get ( i ).getResultVariable ();
161
- }
162
- rowTransformer = new RowTransformerTupleTransformerAdapter <>( aliases , tupleTransformer );
163
- }
150
+ rowTransformer = getRowTransformer ( executionContext , jdbcValues );
164
151
}
165
152
166
153
final SharedSessionContractImplementor session = executionContext .getSession ();
@@ -204,10 +191,8 @@ public boolean shouldReturnProxies() {
204
191
}
205
192
};
206
193
207
- final JdbcValuesSourceProcessingStateStandardImpl valuesProcessingState = new JdbcValuesSourceProcessingStateStandardImpl (
208
- executionContext ,
209
- processingOptions
210
- );
194
+ final JdbcValuesSourceProcessingStateStandardImpl valuesProcessingState =
195
+ new JdbcValuesSourceProcessingStateStandardImpl ( executionContext , processingOptions );
211
196
212
197
final RowReader <R > rowReader = ResultsHelper .createRowReader (
213
198
session .getFactory (),
@@ -234,7 +219,8 @@ public boolean shouldReturnProxies() {
234
219
235
220
if ( stats ) {
236
221
final long endTime = System .nanoTime ();
237
- final long milliseconds = TimeUnit .MILLISECONDS .convert ( endTime - startTime , TimeUnit .NANOSECONDS );
222
+ final long milliseconds =
223
+ TimeUnit .MILLISECONDS .convert ( endTime - startTime , TimeUnit .NANOSECONDS );
238
224
statistics .queryExecuted (
239
225
executionContext .getQueryIdentifier ( jdbcSelect .getSqlString () ),
240
226
getResultSize ( result ),
@@ -245,11 +231,25 @@ public boolean shouldReturnProxies() {
245
231
return result ;
246
232
}
247
233
248
- private <T > int getResultSize (T result ) {
249
- if ( result instanceof List ) {
250
- return ( (List <?>) result ).size ();
234
+ private static <R > RowTransformer <R > getRowTransformer (ExecutionContext executionContext , JdbcValues jdbcValues ) {
235
+ @ SuppressWarnings ("unchecked" )
236
+ final TupleTransformer <R > tupleTransformer =
237
+ (TupleTransformer <R >) executionContext .getQueryOptions ().getTupleTransformer ();
238
+ if ( tupleTransformer == null ) {
239
+ return RowTransformerStandardImpl .instance ();
240
+ }
241
+ else {
242
+ final List <DomainResult <?>> domainResults = jdbcValues .getValuesMapping ().getDomainResults ();
243
+ final String [] aliases = new String [domainResults .size ()];
244
+ for ( int i = 0 ; i < domainResults .size (); i ++ ) {
245
+ aliases [i ] = domainResults .get ( i ).getResultVariable ();
246
+ }
247
+ return new RowTransformerTupleTransformerAdapter <>( aliases , tupleTransformer );
251
248
}
252
- return -1 ;
249
+ }
250
+
251
+ private <T > int getResultSize (T result ) {
252
+ return result instanceof List <?> list ? list .size () : -1 ;
253
253
}
254
254
255
255
private JdbcValues resolveJdbcValuesSource (
@@ -264,8 +264,11 @@ private JdbcValues resolveJdbcValuesSource(
264
264
265
265
final CacheMode cacheMode = resolveCacheMode ( executionContext );
266
266
final JdbcValuesMappingProducer mappingProducer = jdbcSelect .getJdbcValuesMappingProducer ();
267
- final boolean cacheable = queryCacheEnabled && canBeCached
268
- && executionContext .getQueryOptions ().isResultCachingEnabled () == Boolean .TRUE ;
267
+ final QueryOptions queryOptions = executionContext .getQueryOptions ();
268
+ final boolean cacheable =
269
+ queryCacheEnabled
270
+ && canBeCached
271
+ && queryOptions .isResultCachingEnabled () == Boolean .TRUE ;
269
272
270
273
final QueryKey queryResultsCacheKey ;
271
274
final List <?> cachedResults ;
@@ -280,11 +283,11 @@ private JdbcValues resolveJdbcValuesSource(
280
283
}
281
284
282
285
final QueryResultsCache queryCache = factory .getCache ()
283
- .getQueryResultsCache ( executionContext . getQueryOptions () .getResultCacheRegionName () );
286
+ .getQueryResultsCache ( queryOptions .getResultCacheRegionName () );
284
287
285
288
queryResultsCacheKey = QueryKey .from (
286
289
jdbcSelect .getSqlString (),
287
- executionContext . getQueryOptions () .getLimit (),
290
+ queryOptions .getLimit (),
288
291
executionContext .getQueryParameterBindings (),
289
292
session
290
293
);
@@ -324,7 +327,7 @@ private JdbcValues resolveJdbcValuesSource(
324
327
if ( cacheable && cacheMode .isPutEnabled () ) {
325
328
queryResultsCacheKey = QueryKey .from (
326
329
jdbcSelect .getSqlString (),
327
- executionContext . getQueryOptions () .getLimit (),
330
+ queryOptions .getLimit (),
328
331
executionContext .getQueryParameterBindings (),
329
332
session
330
333
);
@@ -334,20 +337,41 @@ private JdbcValues resolveJdbcValuesSource(
334
337
}
335
338
}
336
339
340
+ return resolveJdbcValues (
341
+ queryIdentifier ,
342
+ executionContext ,
343
+ resultSetAccess ,
344
+ cachedResults ,
345
+ queryResultsCacheKey ,
346
+ mappingProducer ,
347
+ session ,
348
+ factory
349
+ );
350
+ }
351
+
352
+ private static AbstractJdbcValues resolveJdbcValues (
353
+ String queryIdentifier ,
354
+ ExecutionContext executionContext ,
355
+ DeferredResultSetAccess resultSetAccess ,
356
+ List <?> cachedResults ,
357
+ QueryKey queryResultsCacheKey ,
358
+ JdbcValuesMappingProducer mappingProducer ,
359
+ SharedSessionContractImplementor session ,
360
+ SessionFactoryImplementor factory ) {
361
+ final LoadQueryInfluencers loadQueryInfluencers = session .getLoadQueryInfluencers ();
337
362
if ( cachedResults == null ) {
338
363
final CachedJdbcValuesMetadata metadataForCache ;
339
364
final JdbcValuesMapping jdbcValuesMapping ;
340
365
if ( queryResultsCacheKey == null ) {
341
- jdbcValuesMapping = mappingProducer .resolve ( resultSetAccess , session . getLoadQueryInfluencers () , factory );
366
+ jdbcValuesMapping = mappingProducer .resolve ( resultSetAccess , loadQueryInfluencers , factory );
342
367
metadataForCache = null ;
343
368
}
344
369
else {
345
370
// If we need to put the values into the cache, we need to be able to capture the JdbcValuesMetadata
346
371
final CapturingJdbcValuesMetadata capturingMetadata = new CapturingJdbcValuesMetadata ( resultSetAccess );
347
- jdbcValuesMapping = mappingProducer .resolve ( capturingMetadata , session . getLoadQueryInfluencers () , factory );
372
+ jdbcValuesMapping = mappingProducer .resolve ( capturingMetadata , loadQueryInfluencers , factory );
348
373
metadataForCache = capturingMetadata .resolveMetadataForCache ();
349
374
}
350
-
351
375
return new JdbcValuesResultSetImpl (
352
376
resultSetAccess ,
353
377
queryResultsCacheKey ,
@@ -360,14 +384,13 @@ private JdbcValues resolveJdbcValuesSource(
360
384
);
361
385
}
362
386
else {
363
- final JdbcValuesMapping jdbcValuesMapping ;
364
- if ( cachedResults .isEmpty () || !( cachedResults .get ( 0 ) instanceof JdbcValuesMetadata ) ) {
365
- jdbcValuesMapping = mappingProducer .resolve ( resultSetAccess , session .getLoadQueryInfluencers (), factory );
366
- }
367
- else {
368
- jdbcValuesMapping = mappingProducer .resolve ( (JdbcValuesMetadata ) cachedResults .get ( 0 ), session .getLoadQueryInfluencers (), factory );
369
- }
370
- return new JdbcValuesCacheHit ( cachedResults , jdbcValuesMapping );
387
+ final JdbcValuesMetadata valuesMetadata =
388
+ !cachedResults .isEmpty ()
389
+ && cachedResults .get ( 0 ) instanceof JdbcValuesMetadata jdbcValuesMetadata
390
+ ? jdbcValuesMetadata
391
+ : resultSetAccess ;
392
+ return new JdbcValuesCacheHit ( cachedResults ,
393
+ mappingProducer .resolve ( valuesMetadata , loadQueryInfluencers , factory ) );
371
394
}
372
395
}
373
396
@@ -414,7 +437,7 @@ public int resolveColumnPosition(String columnName) {
414
437
position = resultSetAccess .resolveColumnPosition ( columnName );
415
438
columnNames [position - 1 ] = columnName ;
416
439
}
417
- else if ( ( position = ArrayHelper . indexOf ( columnNames , columnName ) + 1 ) == 0 ) {
440
+ else if ( ( position = indexOf ( columnNames , columnName ) + 1 ) == 0 ) {
418
441
position = resultSetAccess .resolveColumnPosition ( columnName );
419
442
columnNames [position - 1 ] = columnName ;
420
443
}
@@ -446,16 +469,14 @@ public <J> BasicType<J> resolveType(
446
469
if ( columnNames == null ) {
447
470
initializeArrays ();
448
471
}
449
- final BasicType <J > basicType = resultSetAccess .resolveType ( position , explicitJavaType , typeConfiguration );
472
+ final BasicType <J > basicType =
473
+ resultSetAccess .resolveType ( position , explicitJavaType , typeConfiguration );
450
474
types [position - 1 ] = basicType ;
451
475
return basicType ;
452
476
}
453
477
454
478
public CachedJdbcValuesMetadata resolveMetadataForCache () {
455
- if ( columnNames == null ) {
456
- return null ;
457
- }
458
- return new CachedJdbcValuesMetadata ( columnNames , types );
479
+ return columnNames == null ? null : new CachedJdbcValuesMetadata ( columnNames , types );
459
480
}
460
481
}
461
482
0 commit comments