Skip to content

Commit 2a90123

Browse files
committed
HHH-3051 corrected Loader returnTypes
1 parent fcd6f1b commit 2a90123

File tree

6 files changed

+86
-27
lines changed

6 files changed

+86
-27
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(), actualReturnTypes );
939+
return list( session, queryParameters, getQuerySpaces() );
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, returnTypes, hi, session );
1175+
return scroll( queryParameters, hi, session );
11761176
}
11771177

11781178
@Override

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

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

20832083
protected void autoDiscoverTypes(ResultSet rs) {
20842084
throw new AssertionFailure("Auto discover types not supported in this loader");
2085-
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];
20862095
}
20872096

20882097
private ResultSet wrapResultSetIfEnabled(final ResultSet rs, final SessionImplementor session) {
@@ -2349,14 +2358,13 @@ protected final void loadCollectionSubselect(
23492358
protected List list(
23502359
final SessionImplementor session,
23512360
final QueryParameters queryParameters,
2352-
final Set<Serializable> querySpaces,
2353-
final Type[] resultTypes) throws HibernateException {
2361+
final Set<Serializable> querySpaces) throws HibernateException {
23542362

23552363
final boolean cacheable = factory.getSettings().isQueryCacheEnabled() &&
23562364
queryParameters.isCacheable();
23572365

23582366
if ( cacheable ) {
2359-
return listUsingQueryCache( session, queryParameters, querySpaces, resultTypes );
2367+
return listUsingQueryCache( session, queryParameters, querySpaces );
23602368
}
23612369
else {
23622370
return listIgnoreQueryCache( session, queryParameters );
@@ -2370,8 +2378,7 @@ private List listIgnoreQueryCache(SessionImplementor session, QueryParameters qu
23702378
private List listUsingQueryCache(
23712379
final SessionImplementor session,
23722380
final QueryParameters queryParameters,
2373-
final Set<Serializable> querySpaces,
2374-
final Type[] resultTypes) {
2381+
final Set<Serializable> querySpaces) {
23752382

23762383
QueryCache queryCache = factory.getQueryCache( queryParameters.getCacheRegion() );
23772384

@@ -2387,7 +2394,6 @@ private List listUsingQueryCache(
23872394
session,
23882395
queryParameters,
23892396
querySpaces,
2390-
resultTypes,
23912397
queryCache,
23922398
key
23932399
);
@@ -2398,7 +2404,6 @@ private List listUsingQueryCache(
23982404
putResultInQueryCache(
23992405
session,
24002406
queryParameters,
2401-
resultTypes,
24022407
queryCache,
24032408
key,
24042409
result
@@ -2448,17 +2453,17 @@ private List getResultFromQueryCache(
24482453
final SessionImplementor session,
24492454
final QueryParameters queryParameters,
24502455
final Set<Serializable> querySpaces,
2451-
final Type[] resultTypes,
24522456
final QueryCache queryCache,
24532457
final QueryKey key) {
24542458
List result = null;
2455-
2459+
final Type[] returnTypes = getReturnTypes();
2460+
24562461
if ( session.getCacheMode().isGetEnabled() ) {
24572462
boolean isImmutableNaturalKeyLookup =
24582463
queryParameters.isNaturalKeyLookup() &&
2459-
resultTypes.length == 1 &&
2460-
resultTypes[0].isEntityType() &&
2461-
getEntityPersister( EntityType.class.cast( resultTypes[0] ) )
2464+
returnTypes.length == 1 &&
2465+
returnTypes[0].isEntityType() &&
2466+
getEntityPersister( EntityType.class.cast( returnTypes[0] ) )
24622467
.getEntityMetamodel()
24632468
.hasImmutableNaturalId();
24642469

@@ -2477,7 +2482,7 @@ private List getResultFromQueryCache(
24772482
try {
24782483
result = queryCache.get(
24792484
key,
2480-
key.getResultTransformer().getCachedResultTypes( resultTypes ),
2485+
key.getResultTransformer().getCachedResultTypes( returnTypes ),
24812486
isImmutableNaturalKeyLookup,
24822487
querySpaces,
24832488
session
@@ -2509,14 +2514,13 @@ private EntityPersister getEntityPersister(EntityType entityType) {
25092514
private void putResultInQueryCache(
25102515
final SessionImplementor session,
25112516
final QueryParameters queryParameters,
2512-
final Type[] resultTypes,
25132517
final QueryCache queryCache,
25142518
final QueryKey key,
25152519
final List result) {
25162520
if ( session.getCacheMode().isPutEnabled() ) {
25172521
boolean put = queryCache.put(
25182522
key,
2519-
key.getResultTransformer().getCachedResultTypes( resultTypes ),
2523+
key.getResultTransformer().getCachedResultTypes( getReturnTypes() ),
25202524
result,
25212525
queryParameters.isNaturalKeyLookup(),
25222526
session
@@ -2605,7 +2609,6 @@ protected boolean needsFetchingScroll() {
26052609
*/
26062610
protected ScrollableResults scroll(
26072611
final QueryParameters queryParameters,
2608-
final Type[] returnTypes,
26092612
final HolderInstantiator holderInstantiator,
26102613
final SessionImplementor session) throws HibernateException {
26112614

@@ -2638,7 +2641,7 @@ protected ScrollableResults scroll(
26382641
session,
26392642
this,
26402643
queryParameters,
2641-
returnTypes,
2644+
getReturnTypes(),
26422645
holderInstantiator
26432646
);
26442647
}
@@ -2649,7 +2652,7 @@ protected ScrollableResults scroll(
26492652
session,
26502653
this,
26512654
queryParameters,
2652-
returnTypes,
2655+
getReturnTypes(),
26532656
holderInstantiator
26542657
);
26552658
}

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

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

115115
}
116116

117+
protected Type[] getReturnTypes() {
118+
return resultTypes;
119+
}
120+
117121
public ScrollableResults scroll(SessionImplementor session, ScrollMode scrollMode)
118122
throws HibernateException {
119123
QueryParameters qp = translator.getQueryParameters();
120124
qp.setScrollMode(scrollMode);
121-
return scroll(qp, resultTypes, null, session);
125+
return scroll(qp, null, session);
122126
}
123127

124128
public List list(SessionImplementor session)
125129
throws HibernateException {
126-
return list( session, translator.getQueryParameters(), querySpaces, resultTypes );
130+
return list( session, translator.getQueryParameters(), querySpaces );
127131

128132
}
129133
@Override

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,9 +346,13 @@ protected int[] getCollectionOwners() {
346346
protected int[] getOwners() {
347347
return entiytOwners;
348348
}
349+
350+
protected Type[] getReturnTypes() {
351+
return resultTypes;
352+
}
349353

350354
public List list(SessionImplementor session, QueryParameters queryParameters) throws HibernateException {
351-
return list( session, queryParameters, querySpaces, resultTypes );
355+
return list( session, queryParameters, querySpaces );
352356
}
353357

354358
@Override
@@ -384,7 +388,6 @@ public ScrollableResults scroll(final QueryParameters queryParameters, final Ses
384388
throws HibernateException {
385389
return scroll(
386390
queryParameters,
387-
resultTypes,
388391
getHolderInstantiator( queryParameters.getResultTransformer(), getReturnAliasesForTransformer() ),
389392
session
390393
);

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

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

499503
private void checkQuery(QueryParameters queryParameters) {
@@ -557,7 +561,6 @@ public ScrollableResults scroll(
557561
checkQuery( queryParameters );
558562
return scroll(
559563
queryParameters,
560-
queryReturnTypes,
561564
buildHolderInstantiator( queryParameters.getResultTransformer() ),
562565
session
563566
);

hibernate-core/src/test/java/org/hibernate/test/querycache/QueryCacheTest.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
package org.hibernate.test.querycache;
2525

2626
import static org.junit.Assert.assertEquals;
27+
import static org.junit.Assert.assertNotNull;
2728
import static org.junit.Assert.assertTrue;
2829

2930
import java.util.ArrayList;
@@ -33,6 +34,7 @@
3334
import org.hibernate.Criteria;
3435
import org.hibernate.Hibernate;
3536
import org.hibernate.Query;
37+
import org.hibernate.SQLQuery;
3638
import org.hibernate.Session;
3739
import org.hibernate.Transaction;
3840
import org.hibernate.cfg.Configuration;
@@ -487,6 +489,50 @@ public void testGetByCompositeId() {
487489
s.close();
488490
}
489491

492+
@Test
493+
@TestForIssue( jiraKey = "HHH-3051" )
494+
public void testScalarSQLQuery() {
495+
sessionFactory().getCache().evictQueryRegions();
496+
sessionFactory().getStatistics().clear();
497+
498+
Session s = openSession();
499+
s.beginTransaction();
500+
Item item = new Item();
501+
item.setName("fooName");
502+
item.setDescription("fooDescription");
503+
s.persist(item);
504+
s.getTransaction().commit();
505+
s.close();
506+
507+
s = openSession();
508+
s.beginTransaction();
509+
510+
// Note: StandardQueryCache#put handles single results and multiple results differently. So, test both
511+
// 1 and 2+ scalars.
512+
513+
String sqlQuery = "select name, description from Items";
514+
SQLQuery query = s.createSQLQuery(sqlQuery);
515+
query.setCacheable(true);
516+
query.addScalar("name");
517+
query.addScalar("description");
518+
Object[] result1 = (Object[]) query.uniqueResult();
519+
assertNotNull( result1 );
520+
assertEquals( result1.length, 2 );
521+
assertEquals( result1[0], "fooName" );
522+
assertEquals( result1[1], "fooDescription" );
523+
524+
sqlQuery = "select name from Items";
525+
query = s.createSQLQuery(sqlQuery);
526+
query.setCacheable(true);
527+
query.addScalar("name");
528+
String result2 = (String) query.uniqueResult();
529+
assertNotNull( result2 );
530+
assertEquals( result2, "fooName" );
531+
532+
s.getTransaction().commit();
533+
s.close();
534+
}
535+
490536
// @Test
491537
// public void testGetByCompositeIdNoCache() {
492538
// Query query = em.createQuery("FROM EntityWithCompositeKey e WHERE e.pk = :pk");

0 commit comments

Comments
 (0)