Skip to content

Commit 199a1aa

Browse files
authored
Fix wrong order by with ordered collection fetch in Criteria (#2521)
Fixes #1075
1 parent 07aab2e commit 199a1aa

File tree

4 files changed

+124
-5
lines changed

4 files changed

+124
-5
lines changed

src/NHibernate.Test/Async/Criteria/CriteriaQueryTest.cs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using System;
1212
using System.Collections;
1313
using System.Collections.Generic;
14+
using System.Linq;
1415
using NHibernate.Dialect;
1516
using NHibernate.Criterion;
1617
using NHibernate.Linq;
@@ -2085,6 +2086,64 @@ public async Task RestrictionOnSubclassCollectionAsync()
20852086
s.Close();
20862087
}
20872088

2089+
//NH-2239 (GH-1075) - Wrong OrderBy in generated SQL
2090+
[Test]
2091+
public async Task OrderByAndOrderedCollectionAsync()
2092+
{
2093+
var reptile1 = new Reptile { SerialNumber = "9" };
2094+
var reptile2 = new Reptile { SerialNumber = "8" };
2095+
var reptile3 = new Reptile { SerialNumber = "7" };
2096+
var reptile4 = new Reptile { SerialNumber = "6" };
2097+
var reptile5 = new Reptile { SerialNumber = "5" };
2098+
2099+
using (var s = OpenSession())
2100+
using (var t = s.BeginTransaction())
2101+
{
2102+
await (s.SaveAsync(reptile5));
2103+
await (s.SaveAsync(reptile1));
2104+
await (s.SaveAsync(reptile2));
2105+
await (s.SaveAsync(reptile3));
2106+
await (s.SaveAsync(reptile4));
2107+
2108+
reptile1.AddOffspring(reptile4);
2109+
reptile1.AddOffspring(reptile2);
2110+
reptile4.Father = reptile3;
2111+
reptile2.Father = reptile4;
2112+
reptile1.Father = reptile5;
2113+
reptile3.AddOffspring(reptile1);
2114+
2115+
await (t.CommitAsync());
2116+
}
2117+
2118+
using(var s = OpenSession())
2119+
{
2120+
var list = await (s.CreateCriteria(typeof(Reptile))
2121+
.Fetch(SelectMode.Fetch, "offspring")
2122+
.AddOrder(Order.Asc("serialNumber"))
2123+
.SetResultTransformer(Transformers.DistinctRootEntity)
2124+
.ListAsync<Reptile>());
2125+
2126+
var expectedList = list.OrderBy(x => x.SerialNumber).ToList();
2127+
2128+
Assert.That(list.Count, Is.EqualTo(5));
2129+
CollectionAssert.AreEqual(expectedList, list);
2130+
2131+
var mother = expectedList.Last();
2132+
Assert.That(NHibernateUtil.IsInitialized(mother.Offspring), Is.True);
2133+
2134+
var expectedAssociationList = mother.Offspring.OrderBy(r => r.Father.Id).ToList();
2135+
Assert.That(expectedAssociationList.Count, Is.EqualTo(2));
2136+
CollectionAssert.AreEqual(expectedAssociationList, mother.Offspring);
2137+
}
2138+
2139+
using (var s = OpenSession())
2140+
using (var t = s.BeginTransaction())
2141+
{
2142+
await (s.DeleteAsync("from Reptile"));
2143+
await (t.CommitAsync());
2144+
}
2145+
}
2146+
20882147
[Test]
20892148
public async Task ClassPropertyAsync()
20902149
{

src/NHibernate.Test/Criteria/Animal.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ public virtual string SerialNumber
6161
set { serialNumber = value; }
6262
}
6363

64-
private bool howHappyIsHe;
64+
private string howHappyIsHe;
6565

66-
public virtual bool HowHappyIsHe
66+
public virtual string HowHappyIsHe
6767
{
6868
get { return howHappyIsHe; }
6969
set { howHappyIsHe = value; }
@@ -85,6 +85,8 @@ public virtual void AddOffspring(Animal offspring)
8585
{
8686
this.Offspring = new HashSet<Animal>();
8787
}
88+
89+
offspring.Mother = this;
8890
this.Offspring.Add(offspring);
8991
}
9092
}

src/NHibernate.Test/Criteria/CriteriaQueryTest.cs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections;
33
using System.Collections.Generic;
4+
using System.Linq;
45
using NHibernate.Dialect;
56
using NHibernate.Criterion;
67
using NHibernate.Linq;
@@ -2182,6 +2183,64 @@ public void RestrictionOnSubclassCollection()
21822183
s.Close();
21832184
}
21842185

2186+
//NH-2239 (GH-1075) - Wrong OrderBy in generated SQL
2187+
[Test]
2188+
public void OrderByAndOrderedCollection()
2189+
{
2190+
var reptile1 = new Reptile { SerialNumber = "9" };
2191+
var reptile2 = new Reptile { SerialNumber = "8" };
2192+
var reptile3 = new Reptile { SerialNumber = "7" };
2193+
var reptile4 = new Reptile { SerialNumber = "6" };
2194+
var reptile5 = new Reptile { SerialNumber = "5" };
2195+
2196+
using (var s = OpenSession())
2197+
using (var t = s.BeginTransaction())
2198+
{
2199+
s.Save(reptile5);
2200+
s.Save(reptile1);
2201+
s.Save(reptile2);
2202+
s.Save(reptile3);
2203+
s.Save(reptile4);
2204+
2205+
reptile1.AddOffspring(reptile4);
2206+
reptile1.AddOffspring(reptile2);
2207+
reptile4.Father = reptile3;
2208+
reptile2.Father = reptile4;
2209+
reptile1.Father = reptile5;
2210+
reptile3.AddOffspring(reptile1);
2211+
2212+
t.Commit();
2213+
}
2214+
2215+
using(var s = OpenSession())
2216+
{
2217+
var list = s.CreateCriteria(typeof(Reptile))
2218+
.Fetch(SelectMode.Fetch, "offspring")
2219+
.AddOrder(Order.Asc("serialNumber"))
2220+
.SetResultTransformer(Transformers.DistinctRootEntity)
2221+
.List<Reptile>();
2222+
2223+
var expectedList = list.OrderBy(x => x.SerialNumber).ToList();
2224+
2225+
Assert.That(list.Count, Is.EqualTo(5));
2226+
CollectionAssert.AreEqual(expectedList, list);
2227+
2228+
var mother = expectedList.Last();
2229+
Assert.That(NHibernateUtil.IsInitialized(mother.Offspring), Is.True);
2230+
2231+
var expectedAssociationList = mother.Offspring.OrderBy(r => r.Father.Id).ToList();
2232+
Assert.That(expectedAssociationList.Count, Is.EqualTo(2));
2233+
CollectionAssert.AreEqual(expectedAssociationList, mother.Offspring);
2234+
}
2235+
2236+
using (var s = OpenSession())
2237+
using (var t = s.BeginTransaction())
2238+
{
2239+
s.Delete("from Reptile");
2240+
t.Commit();
2241+
}
2242+
}
2243+
21852244
[Test]
21862245
public void ClassProperty()
21872246
{

src/NHibernate/Loader/JoinWalker.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -818,10 +818,9 @@ protected SqlString MergeOrderings(SqlString ass, SqlString orderBy)
818818
{
819819
if (ass.Length == 0)
820820
return orderBy;
821-
else if (orderBy.Length == 0)
821+
if (orderBy.Length == 0)
822822
return ass;
823-
else
824-
return ass.Append(StringHelper.CommaSpace, orderBy);
823+
return orderBy.Append(StringHelper.CommaSpace, ass);
825824
}
826825

827826
protected SqlString MergeOrderings(string ass, SqlString orderBy) {

0 commit comments

Comments
 (0)