1212import org .hibernate .SharedSessionContract ;
1313import org .hibernate .cache .spi .QueryKey ;
1414import org .hibernate .cache .spi .QueryResultsCache ;
15+ import org .hibernate .engine .spi .LoadQueryInfluencers ;
1516import org .hibernate .engine .spi .PersistenceContext ;
1617import org .hibernate .engine .spi .SessionFactoryImplementor ;
1718import org .hibernate .engine .spi .SharedSessionContractImplementor ;
18- import org .hibernate .internal .util .collections .ArrayHelper ;
1919import org .hibernate .query .TupleTransformer ;
2020import org .hibernate .query .spi .QueryOptions ;
2121import org .hibernate .sql .exec .SqlExecLogger ;
2828import org .hibernate .sql .results .internal .RowProcessingStateStandardImpl ;
2929import org .hibernate .sql .results .internal .RowTransformerStandardImpl ;
3030import org .hibernate .sql .results .internal .RowTransformerTupleTransformerAdapter ;
31+ import org .hibernate .sql .results .jdbc .internal .AbstractJdbcValues ;
3132import org .hibernate .sql .results .jdbc .internal .CachedJdbcValuesMetadata ;
3233import org .hibernate .sql .results .jdbc .internal .DeferredResultSetAccess ;
3334import org .hibernate .sql .results .jdbc .internal .JdbcValuesCacheHit ;
4849import org .hibernate .type .spi .TypeConfiguration ;
4950
5051import static org .hibernate .internal .util .NullnessHelper .coalesceSuppliedValues ;
52+ import static org .hibernate .internal .util .collections .ArrayHelper .indexOf ;
5153
5254/**
5355 * Standard JdbcSelectExecutor implementation used by Hibernate,
@@ -145,22 +147,7 @@ private <T, R> T doExecuteQuery(
145147 );
146148
147149 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 );
164151 }
165152
166153 final SharedSessionContractImplementor session = executionContext .getSession ();
@@ -204,10 +191,8 @@ public boolean shouldReturnProxies() {
204191 }
205192 };
206193
207- final JdbcValuesSourceProcessingStateStandardImpl valuesProcessingState = new JdbcValuesSourceProcessingStateStandardImpl (
208- executionContext ,
209- processingOptions
210- );
194+ final JdbcValuesSourceProcessingStateStandardImpl valuesProcessingState =
195+ new JdbcValuesSourceProcessingStateStandardImpl ( executionContext , processingOptions );
211196
212197 final RowReader <R > rowReader = ResultsHelper .createRowReader (
213198 session .getFactory (),
@@ -234,7 +219,8 @@ public boolean shouldReturnProxies() {
234219
235220 if ( stats ) {
236221 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 );
238224 statistics .queryExecuted (
239225 executionContext .getQueryIdentifier ( jdbcSelect .getSqlString () ),
240226 getResultSize ( result ),
@@ -245,11 +231,25 @@ public boolean shouldReturnProxies() {
245231 return result ;
246232 }
247233
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 );
251248 }
252- return -1 ;
249+ }
250+
251+ private <T > int getResultSize (T result ) {
252+ return result instanceof List <?> list ? list .size () : -1 ;
253253 }
254254
255255 private JdbcValues resolveJdbcValuesSource (
@@ -264,8 +264,11 @@ private JdbcValues resolveJdbcValuesSource(
264264
265265 final CacheMode cacheMode = resolveCacheMode ( executionContext );
266266 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 ;
269272
270273 final QueryKey queryResultsCacheKey ;
271274 final List <?> cachedResults ;
@@ -280,11 +283,11 @@ private JdbcValues resolveJdbcValuesSource(
280283 }
281284
282285 final QueryResultsCache queryCache = factory .getCache ()
283- .getQueryResultsCache ( executionContext . getQueryOptions () .getResultCacheRegionName () );
286+ .getQueryResultsCache ( queryOptions .getResultCacheRegionName () );
284287
285288 queryResultsCacheKey = QueryKey .from (
286289 jdbcSelect .getSqlString (),
287- executionContext . getQueryOptions () .getLimit (),
290+ queryOptions .getLimit (),
288291 executionContext .getQueryParameterBindings (),
289292 session
290293 );
@@ -324,7 +327,7 @@ private JdbcValues resolveJdbcValuesSource(
324327 if ( cacheable && cacheMode .isPutEnabled () ) {
325328 queryResultsCacheKey = QueryKey .from (
326329 jdbcSelect .getSqlString (),
327- executionContext . getQueryOptions () .getLimit (),
330+ queryOptions .getLimit (),
328331 executionContext .getQueryParameterBindings (),
329332 session
330333 );
@@ -334,20 +337,41 @@ private JdbcValues resolveJdbcValuesSource(
334337 }
335338 }
336339
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 ();
337362 if ( cachedResults == null ) {
338363 final CachedJdbcValuesMetadata metadataForCache ;
339364 final JdbcValuesMapping jdbcValuesMapping ;
340365 if ( queryResultsCacheKey == null ) {
341- jdbcValuesMapping = mappingProducer .resolve ( resultSetAccess , session . getLoadQueryInfluencers () , factory );
366+ jdbcValuesMapping = mappingProducer .resolve ( resultSetAccess , loadQueryInfluencers , factory );
342367 metadataForCache = null ;
343368 }
344369 else {
345370 // If we need to put the values into the cache, we need to be able to capture the JdbcValuesMetadata
346371 final CapturingJdbcValuesMetadata capturingMetadata = new CapturingJdbcValuesMetadata ( resultSetAccess );
347- jdbcValuesMapping = mappingProducer .resolve ( capturingMetadata , session . getLoadQueryInfluencers () , factory );
372+ jdbcValuesMapping = mappingProducer .resolve ( capturingMetadata , loadQueryInfluencers , factory );
348373 metadataForCache = capturingMetadata .resolveMetadataForCache ();
349374 }
350-
351375 return new JdbcValuesResultSetImpl (
352376 resultSetAccess ,
353377 queryResultsCacheKey ,
@@ -360,14 +384,13 @@ private JdbcValues resolveJdbcValuesSource(
360384 );
361385 }
362386 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 ) );
371394 }
372395 }
373396
@@ -414,7 +437,7 @@ public int resolveColumnPosition(String columnName) {
414437 position = resultSetAccess .resolveColumnPosition ( columnName );
415438 columnNames [position - 1 ] = columnName ;
416439 }
417- else if ( ( position = ArrayHelper . indexOf ( columnNames , columnName ) + 1 ) == 0 ) {
440+ else if ( ( position = indexOf ( columnNames , columnName ) + 1 ) == 0 ) {
418441 position = resultSetAccess .resolveColumnPosition ( columnName );
419442 columnNames [position - 1 ] = columnName ;
420443 }
@@ -446,16 +469,14 @@ public <J> BasicType<J> resolveType(
446469 if ( columnNames == null ) {
447470 initializeArrays ();
448471 }
449- final BasicType <J > basicType = resultSetAccess .resolveType ( position , explicitJavaType , typeConfiguration );
472+ final BasicType <J > basicType =
473+ resultSetAccess .resolveType ( position , explicitJavaType , typeConfiguration );
450474 types [position - 1 ] = basicType ;
451475 return basicType ;
452476 }
453477
454478 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 );
459480 }
460481 }
461482
0 commit comments