Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions src/NHibernate.Test/Async/CacheTest/QueryCacheFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
using System.Collections;
using NHibernate.Cfg;
using NHibernate.DomainModel;
using NHibernate.Transform;
using NUnit.Framework;
using Environment = NHibernate.Cfg.Environment;

Expand Down Expand Up @@ -101,5 +102,40 @@ public async Task QueryCacheWithScalarReturnAsync()
Assert.That(result, Is.EqualTo(200012), "Unexpected cached result");
}
}

[Test]
public async Task QueryCacheWithAliasToBeanTransformerAsync()
{
using (var s = OpenSession())
{
const string query = "select s.id_ as Id from Simple as s";
var result1 = await (s
.CreateSQLQuery(query)
.SetCacheable(true)
.SetResultTransformer(Transformers.AliasToBean<SimpleDTO>())
.UniqueResultAsync());

Assert.That(result1, Is.InstanceOf<SimpleDTO>());
var dto1 = (SimpleDTO)result1;
Assert.That(dto1.Id, Is.EqualTo(1));

// Run a second time, just to test the query cache
var result2 = await (s
.CreateSQLQuery(query)
.SetCacheable(true)
.SetResultTransformer(Transformers.AliasToBean<SimpleDTO>())
.UniqueResultAsync());

Assert.That(result2, Is.InstanceOf<SimpleDTO>());
var dto2 = (SimpleDTO)result2;
Assert.That(dto2.Id, Is.EqualTo(1));
}
}

private class SimpleDTO
{
public long Id { get; set; }
public string Address { get; set; }
}
}
}
36 changes: 36 additions & 0 deletions src/NHibernate.Test/CacheTest/QueryCacheFixture.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.Collections;
using NHibernate.Cfg;
using NHibernate.DomainModel;
using NHibernate.Transform;
using NUnit.Framework;
using Environment = NHibernate.Cfg.Environment;

Expand Down Expand Up @@ -90,5 +91,40 @@ public void QueryCacheWithScalarReturn()
Assert.That(result, Is.EqualTo(200012), "Unexpected cached result");
}
}

[Test]
public void QueryCacheWithAliasToBeanTransformer()
{
using (var s = OpenSession())
{
const string query = "select s.id_ as Id from Simple as s";
var result1 = s
.CreateSQLQuery(query)
.SetCacheable(true)
.SetResultTransformer(Transformers.AliasToBean<SimpleDTO>())
.UniqueResult();

Assert.That(result1, Is.InstanceOf<SimpleDTO>());
var dto1 = (SimpleDTO)result1;
Assert.That(dto1.Id, Is.EqualTo(1));

// Run a second time, just to test the query cache
var result2 = s
.CreateSQLQuery(query)
.SetCacheable(true)
.SetResultTransformer(Transformers.AliasToBean<SimpleDTO>())
.UniqueResult();

Assert.That(result2, Is.InstanceOf<SimpleDTO>());
var dto2 = (SimpleDTO)result2;
Assert.That(dto2.Id, Is.EqualTo(1));
}
}

private class SimpleDTO
{
public long Id { get; set; }
public string Address { get; set; }
}
}
}
1 change: 1 addition & 0 deletions src/NHibernate/Async/Loader/Loader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1391,6 +1391,7 @@ private async Task<IList> ListUsingQueryCacheAsync(ISessionImplementor session,
else
{
result = queryCacheBuilder.GetResultList(result);
ApplyCachedMetadata(key.ResultTransformer);
}

result = TransformCacheableResults(queryParameters, key.ResultTransformer, result);
Expand Down
8 changes: 8 additions & 0 deletions src/NHibernate/Loader/Custom/CustomLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -380,6 +380,14 @@ public override void AutoDiscoverTypes(
queryParameters.ResultTransformer, transformerAliases);
}

protected override void ApplyCachedMetadata(CacheableResultTransformer resultTransformer)
{
if (transformerAliases.Length == 0 && resultTransformer?.AutoDiscoveredAliases?.Length > 0)
{
transformerAliases = resultTransformer.AutoDiscoveredAliases;
}
}

protected override void ResetEffectiveExpectedType(IEnumerable<IParameterSpecification> parameterSpecs, QueryParameters queryParameters)
{
parameterSpecs.ResetEffectiveExpectedType(queryParameters);
Expand Down
5 changes: 5 additions & 0 deletions src/NHibernate/Loader/Loader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1894,13 +1894,18 @@ private IList ListUsingQueryCache(ISessionImplementor session, QueryParameters q
else
{
result = queryCacheBuilder.GetResultList(result);
ApplyCachedMetadata(key.ResultTransformer);
}

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

return GetResultList(result, queryParameters.ResultTransformer);
}

protected virtual void ApplyCachedMetadata(CacheableResultTransformer resultTransformer)
{
}

public IList TransformCacheableResults(QueryParameters queryParameters, CacheableResultTransformer transformer, IList result)
{
var resolvedTransformer = ResolveResultTransformer(queryParameters.ResultTransformer);
Expand Down
Loading