Skip to content

Commit fa61701

Browse files
committed
fix #3713 - query cache result transformer aliases bug
1 parent 5062dae commit fa61701

File tree

5 files changed

+86
-0
lines changed

5 files changed

+86
-0
lines changed

src/NHibernate.Test/Async/CacheTest/QueryCacheFixture.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using System.Collections;
1212
using NHibernate.Cfg;
1313
using NHibernate.DomainModel;
14+
using NHibernate.Transform;
1415
using NUnit.Framework;
1516
using Environment = NHibernate.Cfg.Environment;
1617

@@ -101,5 +102,40 @@ public async Task QueryCacheWithScalarReturnAsync()
101102
Assert.That(result, Is.EqualTo(200012), "Unexpected cached result");
102103
}
103104
}
105+
106+
[Test]
107+
public async Task QueryCacheWithAliasToBeanTransformerAsync()
108+
{
109+
using (var s = OpenSession())
110+
{
111+
const string query = "select s.id_ as Id from Simple as s";
112+
var result1 = await (s
113+
.CreateSQLQuery(query)
114+
.SetCacheable(true)
115+
.SetResultTransformer(Transformers.AliasToBean<SimpleDTO>())
116+
.UniqueResultAsync());
117+
118+
Assert.That(result1, Is.InstanceOf<SimpleDTO>());
119+
var dto1 = (SimpleDTO)result1;
120+
Assert.That(dto1.Id, Is.EqualTo(1));
121+
122+
// Run a second time, just to test the query cache
123+
var result2 = await (s
124+
.CreateSQLQuery(query)
125+
.SetCacheable(true)
126+
.SetResultTransformer(Transformers.AliasToBean<SimpleDTO>())
127+
.UniqueResultAsync());
128+
129+
Assert.That(result2, Is.InstanceOf<SimpleDTO>());
130+
var dto2 = (SimpleDTO)result2;
131+
Assert.That(dto2.Id, Is.EqualTo(1));
132+
}
133+
}
134+
135+
private class SimpleDTO
136+
{
137+
public long Id { get; set; }
138+
public string Address { get; set; }
139+
}
104140
}
105141
}

src/NHibernate.Test/CacheTest/QueryCacheFixture.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Collections;
22
using NHibernate.Cfg;
33
using NHibernate.DomainModel;
4+
using NHibernate.Transform;
45
using NUnit.Framework;
56
using Environment = NHibernate.Cfg.Environment;
67

@@ -90,5 +91,40 @@ public void QueryCacheWithScalarReturn()
9091
Assert.That(result, Is.EqualTo(200012), "Unexpected cached result");
9192
}
9293
}
94+
95+
[Test]
96+
public void QueryCacheWithAliasToBeanTransformer()
97+
{
98+
using (var s = OpenSession())
99+
{
100+
const string query = "select s.id_ as Id from Simple as s";
101+
var result1 = s
102+
.CreateSQLQuery(query)
103+
.SetCacheable(true)
104+
.SetResultTransformer(Transformers.AliasToBean<SimpleDTO>())
105+
.UniqueResult();
106+
107+
Assert.That(result1, Is.InstanceOf<SimpleDTO>());
108+
var dto1 = (SimpleDTO)result1;
109+
Assert.That(dto1.Id, Is.EqualTo(1));
110+
111+
// Run a second time, just to test the query cache
112+
var result2 = s
113+
.CreateSQLQuery(query)
114+
.SetCacheable(true)
115+
.SetResultTransformer(Transformers.AliasToBean<SimpleDTO>())
116+
.UniqueResult();
117+
118+
Assert.That(result2, Is.InstanceOf<SimpleDTO>());
119+
var dto2 = (SimpleDTO)result2;
120+
Assert.That(dto2.Id, Is.EqualTo(1));
121+
}
122+
}
123+
124+
private class SimpleDTO
125+
{
126+
public long Id { get; set; }
127+
public string Address { get; set; }
128+
}
93129
}
94130
}

src/NHibernate/Async/Loader/Loader.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1391,6 +1391,7 @@ private async Task<IList> ListUsingQueryCacheAsync(ISessionImplementor session,
13911391
else
13921392
{
13931393
result = queryCacheBuilder.GetResultList(result);
1394+
ApplyCachedMetadata(key.ResultTransformer);
13941395
}
13951396

13961397
result = TransformCacheableResults(queryParameters, key.ResultTransformer, result);

src/NHibernate/Loader/Custom/CustomLoader.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,14 @@ public override void AutoDiscoverTypes(
380380
queryParameters.ResultTransformer, transformerAliases);
381381
}
382382

383+
protected override void ApplyCachedMetadata(CacheableResultTransformer resultTransformer)
384+
{
385+
if (transformerAliases.Length == 0 && resultTransformer?.AutoDiscoveredAliases?.Length > 0)
386+
{
387+
transformerAliases = resultTransformer.AutoDiscoveredAliases;
388+
}
389+
}
390+
383391
protected override void ResetEffectiveExpectedType(IEnumerable<IParameterSpecification> parameterSpecs, QueryParameters queryParameters)
384392
{
385393
parameterSpecs.ResetEffectiveExpectedType(queryParameters);

src/NHibernate/Loader/Loader.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1894,13 +1894,18 @@ private IList ListUsingQueryCache(ISessionImplementor session, QueryParameters q
18941894
else
18951895
{
18961896
result = queryCacheBuilder.GetResultList(result);
1897+
ApplyCachedMetadata(key.ResultTransformer);
18971898
}
18981899

18991900
result = TransformCacheableResults(queryParameters, key.ResultTransformer, result);
19001901

19011902
return GetResultList(result, queryParameters.ResultTransformer);
19021903
}
19031904

1905+
protected virtual void ApplyCachedMetadata(CacheableResultTransformer resultTransformer)
1906+
{
1907+
}
1908+
19041909
public IList TransformCacheableResults(QueryParameters queryParameters, CacheableResultTransformer transformer, IList result)
19051910
{
19061911
var resolvedTransformer = ResolveResultTransformer(queryParameters.ResultTransformer);

0 commit comments

Comments
 (0)