diff --git a/src/NHibernate.Test/NHSpecificTest/NH3666/Entity.cs b/src/NHibernate.Test/NHSpecificTest/NH3666/Entity.cs new file mode 100644 index 00000000000..2634bb82806 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/NH3666/Entity.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NHibernate.Test.NHSpecificTest.NH3666 +{ + public class Entity + { + public virtual int Id { get; set; } + public virtual string Property { get; set; } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH3666/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3666/Fixture.cs new file mode 100644 index 00000000000..07cf3ce44b3 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/NH3666/Fixture.cs @@ -0,0 +1,75 @@ +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NHibernate.Test.NHSpecificTest.NH3666 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnSetUp() + { + using (var session = this.OpenSession()) + using (var transaction = session.BeginTransaction()) + { + var entity1 = new Entity { Id = 1, Property = "Test1" }; + var entity2 = new Entity { Id = 2, Property = "Test2" }; + var entity3 = new Entity { Id = 3, Property = "Test3" }; + + session.Save(entity1); + session.Save(entity2); + session.Save(entity3); + + transaction.Commit(); + } + } + + protected override void OnTearDown() + { + using (var session = this.OpenSession()) + using (var transaction = session.BeginTransaction()) + { + session.Delete("from Entity"); + transaction.Commit(); + } + } + + [Test] + public void CacheableDoesNotThrowExceptionWithNativeSQLQuery() + { + using (var session = this.OpenSession()) + using (var transaction = session.BeginTransaction()) + { + var result = session.CreateSQLQuery("SELECT * FROM Entity WHERE Property = 'Test2'") + .AddEntity(typeof(Entity)) + .SetCacheable(true) + .List(); + + CollectionAssert.IsNotEmpty(result); + + Assert.AreEqual(1, result.Count); + Assert.AreEqual(2, result[0].Id); + } + } + + [Test] + public void CacheableDoesNotThrowExceptionWithNamedQuery() + { + using (var session = this.OpenSession()) + using (var transaction = session.BeginTransaction()) + { + var result = session.GetNamedQuery("QueryName") + .SetCacheable(true) + .SetString("prop", "Test2") + .List(); + + CollectionAssert.IsNotEmpty(result); + + Assert.AreEqual(1, result.Count); + Assert.AreEqual(2, result[0].Id); + } + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH3666/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/NH3666/Mappings.hbm.xml new file mode 100644 index 00000000000..52f6dc62aae --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/NH3666/Mappings.hbm.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + SELECT * FROM Entity WHERE Property = :prop + + + diff --git a/src/NHibernate.Test/NHibernate.Test.csproj b/src/NHibernate.Test/NHibernate.Test.csproj index 9b90e13aebc..e5aa8a0e3c6 100644 --- a/src/NHibernate.Test/NHibernate.Test.csproj +++ b/src/NHibernate.Test/NHibernate.Test.csproj @@ -732,6 +732,8 @@ + + @@ -3128,6 +3130,9 @@ + + Designer + diff --git a/src/NHibernate/Loader/Custom/CustomLoader.cs b/src/NHibernate/Loader/Custom/CustomLoader.cs index fd94d46b893..9ba951847c2 100644 --- a/src/NHibernate/Loader/Custom/CustomLoader.cs +++ b/src/NHibernate/Loader/Custom/CustomLoader.cs @@ -38,6 +38,8 @@ public class CustomLoader : Loader private readonly LockMode[] lockModes; private readonly ResultRowProcessor rowProcessor; + private readonly bool[] includeInResultRow; + private IType[] resultTypes; private string[] transformerAliases; @@ -61,6 +63,8 @@ public CustomLoader(ICustomQuery customQuery, ISessionFactoryImplementor factory List resulttypes = new List(); List specifiedAliases = new List(); + List includeInResultRowList = new List(); + int returnableCounter = 0; bool hasScalars = false; @@ -72,6 +76,7 @@ public CustomLoader(ICustomQuery customQuery, ISessionFactoryImplementor factory resulttypes.Add(scalarRtn.Type); specifiedAliases.Add(scalarRtn.ColumnAlias); resultColumnProcessors.Add(new ScalarResultColumnProcessor(scalarRtn.ColumnAlias, scalarRtn.Type)); + includeInResultRowList.Add(true); hasScalars = true; } else if (rtn is RootReturn) @@ -87,6 +92,7 @@ public CustomLoader(ICustomQuery customQuery, ISessionFactoryImplementor factory specifiedAliases.Add(rootRtn.Alias); entityaliases.Add(rootRtn.EntityAliases); querySpaces.UnionWith(persister.QuerySpaces); + includeInResultRowList.Add(true); } else if (rtn is CollectionReturn) { @@ -111,6 +117,7 @@ public CustomLoader(ICustomQuery customQuery, ISessionFactoryImplementor factory entityaliases.Add(collRtn.ElementEntityAliases); querySpaces.UnionWith(elementPersister.QuerySpaces); } + includeInResultRowList.Add(true); } else if (rtn is EntityFetchReturn) { @@ -128,6 +135,7 @@ public CustomLoader(ICustomQuery customQuery, ISessionFactoryImplementor factory specifiedAliases.Add(fetchRtn.Alias); entityaliases.Add(fetchRtn.EntityAliases); querySpaces.UnionWith(persister.QuerySpaces); + includeInResultRowList.Add(false); } else if (rtn is CollectionFetchReturn) { @@ -153,6 +161,7 @@ public CustomLoader(ICustomQuery customQuery, ISessionFactoryImplementor factory entityaliases.Add(fetchRtn.ElementEntityAliases); querySpaces.UnionWith(elementPersister.QuerySpaces); } + includeInResultRowList.Add(false); } else { @@ -170,6 +179,7 @@ public CustomLoader(ICustomQuery customQuery, ISessionFactoryImplementor factory resultTypes = resulttypes.ToArray(); transformerAliases = specifiedAliases.ToArray(); rowProcessor = new ResultRowProcessor(hasScalars, resultColumnProcessors.ToArray()); + includeInResultRow = includeInResultRowList.ToArray(); } public ISet QuerySpaces @@ -289,6 +299,11 @@ protected override IResultTransformer ResolveResultTransformer(IResultTransforme return HolderInstantiator.ResolveResultTransformer(null, resultTransformer); } + protected override bool[] IncludeInResultRow + { + get { return includeInResultRow; } + } + public override IList GetResultList(IList results, IResultTransformer resultTransformer) { // meant to handle dynamic instantiation queries...(Copy from QueryLoader)