Skip to content

Commit b3e79f3

Browse files
committed
HHH-3051 corrected CustomLoader returnTypes (different approach)
1 parent 99a6fc0 commit b3e79f3

File tree

5 files changed

+52
-41
lines changed

5 files changed

+52
-41
lines changed

hibernate-core/src/main/java/org/hibernate/hql/internal/classic/QueryTranslatorImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -936,7 +936,7 @@ void addPathAliasAndJoin(String path, String alias, JoinSequence joinSequence) {
936936
@Override
937937
public List list(SessionImplementor session, QueryParameters queryParameters)
938938
throws HibernateException {
939-
return list( session, queryParameters, getQuerySpaces() );
939+
return list( session, queryParameters, getQuerySpaces(), actualReturnTypes );
940940
}
941941

942942
/**
@@ -1172,7 +1172,7 @@ public ScrollableResults scroll(final QueryParameters queryParameters,
11721172
HolderInstantiator hi = HolderInstantiator.createClassicHolderInstantiator(
11731173
holderConstructor, queryParameters.getResultTransformer()
11741174
);
1175-
return scroll( queryParameters, hi, session );
1175+
return scroll( queryParameters, returnTypes, hi, session );
11761176
}
11771177

11781178
@Override

hibernate-core/src/main/java/org/hibernate/loader/Loader.java

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2082,16 +2082,7 @@ protected final ResultSet getResultSet(
20822082

20832083
protected void autoDiscoverTypes(ResultSet rs) {
20842084
throw new AssertionFailure("Auto discover types not supported in this loader");
2085-
}
2086-
2087-
/**
2088-
* Return types must be retrieved on-demand, rather than, as an example, provided as an argument on the original
2089-
* #list call. They can be overriden later by {@link #autoDiscoverTypes(ResultSet)}, etc.
2090-
*
2091-
* @return Type[]
2092-
*/
2093-
protected Type[] getReturnTypes() {
2094-
return new Type[0];
2085+
20952086
}
20962087

20972088
private ResultSet wrapResultSetIfEnabled(final ResultSet rs, final SessionImplementor session) {
@@ -2358,13 +2349,14 @@ protected final void loadCollectionSubselect(
23582349
protected List list(
23592350
final SessionImplementor session,
23602351
final QueryParameters queryParameters,
2361-
final Set<Serializable> querySpaces) throws HibernateException {
2352+
final Set<Serializable> querySpaces,
2353+
final Type[] resultTypes) throws HibernateException {
23622354

23632355
final boolean cacheable = factory.getSettings().isQueryCacheEnabled() &&
23642356
queryParameters.isCacheable();
23652357

23662358
if ( cacheable ) {
2367-
return listUsingQueryCache( session, queryParameters, querySpaces );
2359+
return listUsingQueryCache( session, queryParameters, querySpaces, resultTypes );
23682360
}
23692361
else {
23702362
return listIgnoreQueryCache( session, queryParameters );
@@ -2378,7 +2370,8 @@ private List listIgnoreQueryCache(SessionImplementor session, QueryParameters qu
23782370
private List listUsingQueryCache(
23792371
final SessionImplementor session,
23802372
final QueryParameters queryParameters,
2381-
final Set<Serializable> querySpaces) {
2373+
final Set<Serializable> querySpaces,
2374+
final Type[] resultTypes) {
23822375

23832376
QueryCache queryCache = factory.getQueryCache( queryParameters.getCacheRegion() );
23842377

@@ -2394,6 +2387,7 @@ private List listUsingQueryCache(
23942387
session,
23952388
queryParameters,
23962389
querySpaces,
2390+
resultTypes,
23972391
queryCache,
23982392
key
23992393
);
@@ -2404,6 +2398,7 @@ private List listUsingQueryCache(
24042398
putResultInQueryCache(
24052399
session,
24062400
queryParameters,
2401+
resultTypes,
24072402
queryCache,
24082403
key,
24092404
result
@@ -2453,17 +2448,17 @@ private List getResultFromQueryCache(
24532448
final SessionImplementor session,
24542449
final QueryParameters queryParameters,
24552450
final Set<Serializable> querySpaces,
2451+
final Type[] resultTypes,
24562452
final QueryCache queryCache,
24572453
final QueryKey key) {
24582454
List result = null;
2459-
final Type[] returnTypes = getReturnTypes();
2460-
2455+
24612456
if ( session.getCacheMode().isGetEnabled() ) {
24622457
boolean isImmutableNaturalKeyLookup =
24632458
queryParameters.isNaturalKeyLookup() &&
2464-
returnTypes.length == 1 &&
2465-
returnTypes[0].isEntityType() &&
2466-
getEntityPersister( EntityType.class.cast( returnTypes[0] ) )
2459+
resultTypes.length == 1 &&
2460+
resultTypes[0].isEntityType() &&
2461+
getEntityPersister( EntityType.class.cast( resultTypes[0] ) )
24672462
.getEntityMetamodel()
24682463
.hasImmutableNaturalId();
24692464

@@ -2482,7 +2477,7 @@ private List getResultFromQueryCache(
24822477
try {
24832478
result = queryCache.get(
24842479
key,
2485-
key.getResultTransformer().getCachedResultTypes( returnTypes ),
2480+
key.getResultTransformer().getCachedResultTypes( resultTypes ),
24862481
isImmutableNaturalKeyLookup,
24872482
querySpaces,
24882483
session
@@ -2511,16 +2506,17 @@ private EntityPersister getEntityPersister(EntityType entityType) {
25112506
return factory.getEntityPersister( entityType.getAssociatedEntityName() );
25122507
}
25132508

2514-
private void putResultInQueryCache(
2509+
protected void putResultInQueryCache(
25152510
final SessionImplementor session,
25162511
final QueryParameters queryParameters,
2512+
final Type[] resultTypes,
25172513
final QueryCache queryCache,
25182514
final QueryKey key,
25192515
final List result) {
25202516
if ( session.getCacheMode().isPutEnabled() ) {
25212517
boolean put = queryCache.put(
25222518
key,
2523-
key.getResultTransformer().getCachedResultTypes( getReturnTypes() ),
2519+
key.getResultTransformer().getCachedResultTypes( resultTypes ),
25242520
result,
25252521
queryParameters.isNaturalKeyLookup(),
25262522
session
@@ -2609,6 +2605,7 @@ protected boolean needsFetchingScroll() {
26092605
*/
26102606
protected ScrollableResults scroll(
26112607
final QueryParameters queryParameters,
2608+
final Type[] returnTypes,
26122609
final HolderInstantiator holderInstantiator,
26132610
final SessionImplementor session) throws HibernateException {
26142611

@@ -2641,7 +2638,7 @@ protected ScrollableResults scroll(
26412638
session,
26422639
this,
26432640
queryParameters,
2644-
getReturnTypes(),
2641+
returnTypes,
26452642
holderInstantiator
26462643
);
26472644
}
@@ -2652,7 +2649,7 @@ protected ScrollableResults scroll(
26522649
session,
26532650
this,
26542651
queryParameters,
2655-
getReturnTypes(),
2652+
returnTypes,
26562653
holderInstantiator
26572654
);
26582655
}

hibernate-core/src/main/java/org/hibernate/loader/criteria/CriteriaLoader.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,20 +114,16 @@ public CriteriaLoader(
114114

115115
}
116116

117-
protected Type[] getReturnTypes() {
118-
return resultTypes;
119-
}
120-
121117
public ScrollableResults scroll(SessionImplementor session, ScrollMode scrollMode)
122118
throws HibernateException {
123119
QueryParameters qp = translator.getQueryParameters();
124120
qp.setScrollMode(scrollMode);
125-
return scroll(qp, null, session);
121+
return scroll(qp, resultTypes, null, session);
126122
}
127123

128124
public List list(SessionImplementor session)
129125
throws HibernateException {
130-
return list( session, translator.getQueryParameters(), querySpaces );
126+
return list( session, translator.getQueryParameters(), querySpaces, resultTypes );
131127

132128
}
133129
@Override

hibernate-core/src/main/java/org/hibernate/loader/custom/CustomLoader.java

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
import org.hibernate.QueryException;
3939
import org.hibernate.ScrollableResults;
4040
import org.hibernate.Session;
41+
import org.hibernate.cache.spi.QueryCache;
42+
import org.hibernate.cache.spi.QueryKey;
4143
import org.hibernate.dialect.Dialect;
4244
import org.hibernate.engine.spi.QueryParameters;
4345
import org.hibernate.engine.spi.SessionFactoryImplementor;
@@ -346,13 +348,9 @@ protected int[] getCollectionOwners() {
346348
protected int[] getOwners() {
347349
return entiytOwners;
348350
}
349-
350-
protected Type[] getReturnTypes() {
351-
return resultTypes;
352-
}
353351

354352
public List list(SessionImplementor session, QueryParameters queryParameters) throws HibernateException {
355-
return list( session, queryParameters, querySpaces );
353+
return list( session, queryParameters, querySpaces, resultTypes );
356354
}
357355

358356
@Override
@@ -388,6 +386,7 @@ public ScrollableResults scroll(final QueryParameters queryParameters, final Ses
388386
throws HibernateException {
389387
return scroll(
390388
queryParameters,
389+
resultTypes,
391390
getHolderInstantiator( queryParameters.getResultTransformer(), getReturnAliasesForTransformer() ),
392391
session
393392
);
@@ -532,5 +531,27 @@ private void validateAliases(List<String> aliases) {
532531
@SuppressWarnings("UnusedParameters")
533532
protected void validateAlias(String alias) {
534533
}
534+
535+
/**
536+
* {@link #resultTypes} can be overridden by {@link #autoDiscoverTypes(ResultSet)},
537+
* *after* {@link #list(SessionImplementor, QueryParameters)} has already been called. It's a bit of a
538+
* chicken-and-the-egg issue since {@link #autoDiscoverTypes(ResultSet)} needs the {@link ResultSet}.
539+
*
540+
* As a hacky workaround, override
541+
* {@link #putResultInQueryCache(SessionImplementor, QueryParameters, Type[], QueryCache, QueryKey, List)} here
542+
* and provide the {@link #resultTypes}.
543+
*
544+
* @see HHH-3051
545+
*/
546+
@Override
547+
protected void putResultInQueryCache(
548+
final SessionImplementor session,
549+
final QueryParameters queryParameters,
550+
final Type[] resultTypes,
551+
final QueryCache queryCache,
552+
final QueryKey key,
553+
final List result) {
554+
super.putResultInQueryCache( session, queryParameters, this.resultTypes, queryCache, key, result );
555+
}
535556

536557
}

hibernate-core/src/main/java/org/hibernate/loader/hql/QueryLoader.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -493,11 +493,7 @@ public List list(
493493
SessionImplementor session,
494494
QueryParameters queryParameters) throws HibernateException {
495495
checkQuery( queryParameters );
496-
return list( session, queryParameters, queryTranslator.getQuerySpaces() );
497-
}
498-
499-
protected Type[] getReturnTypes() {
500-
return queryReturnTypes;
496+
return list( session, queryParameters, queryTranslator.getQuerySpaces(), queryReturnTypes );
501497
}
502498

503499
private void checkQuery(QueryParameters queryParameters) {
@@ -561,6 +557,7 @@ public ScrollableResults scroll(
561557
checkQuery( queryParameters );
562558
return scroll(
563559
queryParameters,
560+
queryReturnTypes,
564561
buildHolderInstantiator( queryParameters.getResultTransformer() ),
565562
session
566563
);

0 commit comments

Comments
 (0)