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 (
@@ -334,20 +334,41 @@ private JdbcValues resolveJdbcValuesSource(
334334 }
335335 }
336336
337+ return resolveJdbcValues (
338+ queryIdentifier ,
339+ executionContext ,
340+ resultSetAccess ,
341+ cachedResults ,
342+ queryResultsCacheKey ,
343+ mappingProducer ,
344+ session ,
345+ factory
346+ );
347+ }
348+
349+ private static AbstractJdbcValues resolveJdbcValues (
350+ String queryIdentifier ,
351+ ExecutionContext executionContext ,
352+ DeferredResultSetAccess resultSetAccess ,
353+ List <?> cachedResults ,
354+ QueryKey queryResultsCacheKey ,
355+ JdbcValuesMappingProducer mappingProducer ,
356+ SharedSessionContractImplementor session ,
357+ SessionFactoryImplementor factory ) {
358+ final LoadQueryInfluencers loadQueryInfluencers = session .getLoadQueryInfluencers ();
337359 if ( cachedResults == null ) {
338360 final CachedJdbcValuesMetadata metadataForCache ;
339361 final JdbcValuesMapping jdbcValuesMapping ;
340362 if ( queryResultsCacheKey == null ) {
341- jdbcValuesMapping = mappingProducer .resolve ( resultSetAccess , session . getLoadQueryInfluencers () , factory );
363+ jdbcValuesMapping = mappingProducer .resolve ( resultSetAccess , loadQueryInfluencers , factory );
342364 metadataForCache = null ;
343365 }
344366 else {
345367 // If we need to put the values into the cache, we need to be able to capture the JdbcValuesMetadata
346368 final CapturingJdbcValuesMetadata capturingMetadata = new CapturingJdbcValuesMetadata ( resultSetAccess );
347- jdbcValuesMapping = mappingProducer .resolve ( capturingMetadata , session . getLoadQueryInfluencers () , factory );
369+ jdbcValuesMapping = mappingProducer .resolve ( capturingMetadata , loadQueryInfluencers , factory );
348370 metadataForCache = capturingMetadata .resolveMetadataForCache ();
349371 }
350-
351372 return new JdbcValuesResultSetImpl (
352373 resultSetAccess ,
353374 queryResultsCacheKey ,
@@ -360,14 +381,13 @@ private JdbcValues resolveJdbcValuesSource(
360381 );
361382 }
362383 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 );
384+ final JdbcValuesMetadata valuesMetadata =
385+ !cachedResults .isEmpty ()
386+ && cachedResults .get ( 0 ) instanceof JdbcValuesMetadata jdbcValuesMetadata
387+ ? jdbcValuesMetadata
388+ : resultSetAccess ;
389+ return new JdbcValuesCacheHit ( cachedResults ,
390+ mappingProducer .resolve ( valuesMetadata , loadQueryInfluencers , factory ) );
371391 }
372392 }
373393
@@ -414,7 +434,7 @@ public int resolveColumnPosition(String columnName) {
414434 position = resultSetAccess .resolveColumnPosition ( columnName );
415435 columnNames [position - 1 ] = columnName ;
416436 }
417- else if ( ( position = ArrayHelper . indexOf ( columnNames , columnName ) + 1 ) == 0 ) {
437+ else if ( ( position = indexOf ( columnNames , columnName ) + 1 ) == 0 ) {
418438 position = resultSetAccess .resolveColumnPosition ( columnName );
419439 columnNames [position - 1 ] = columnName ;
420440 }
@@ -446,16 +466,14 @@ public <J> BasicType<J> resolveType(
446466 if ( columnNames == null ) {
447467 initializeArrays ();
448468 }
449- final BasicType <J > basicType = resultSetAccess .resolveType ( position , explicitJavaType , typeConfiguration );
469+ final BasicType <J > basicType =
470+ resultSetAccess .resolveType ( position , explicitJavaType , typeConfiguration );
450471 types [position - 1 ] = basicType ;
451472 return basicType ;
452473 }
453474
454475 public CachedJdbcValuesMetadata resolveMetadataForCache () {
455- if ( columnNames == null ) {
456- return null ;
457- }
458- return new CachedJdbcValuesMetadata ( columnNames , types );
476+ return columnNames == null ? null : new CachedJdbcValuesMetadata ( columnNames , types );
459477 }
460478 }
461479
0 commit comments