Skip to content

Commit 151194f

Browse files
bahusoidhazzik
authored andcommitted
Fix cacheable CreateSQLQuery throws ArgumentException on query with AddJoin
1 parent f824b0b commit 151194f

File tree

3 files changed

+222
-83
lines changed

3 files changed

+222
-83
lines changed

src/NHibernate.Test/Async/SqlTest/Query/NativeSQLQueriesFixture.cs

Lines changed: 110 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -90,61 +90,130 @@ public async Task FailOnNoAddEntityOrScalarAsync()
9090
[Test]
9191
public async Task SQLQueryInterfaceAsync()
9292
{
93-
ISession s = OpenSession();
94-
ITransaction t = s.BeginTransaction();
9593
Organization ifa = new Organization("IFA");
9694
Organization jboss = new Organization("JBoss");
9795
Person gavin = new Person("Gavin");
9896
Employment emp = new Employment(gavin, jboss, "AU");
9997

100-
await (s.SaveAsync(ifa));
101-
await (s.SaveAsync(jboss));
102-
await (s.SaveAsync(gavin));
103-
await (s.SaveAsync(emp));
98+
using (ISession s = OpenSession())
99+
using (ITransaction t = s.BeginTransaction())
100+
{
101+
await (s.SaveAsync(ifa));
102+
await (s.SaveAsync(jboss));
103+
await (s.SaveAsync(gavin));
104+
await (s.SaveAsync(emp));
105+
106+
IList l = await (s.CreateSQLQuery(OrgEmpRegionSQL)
107+
.AddEntity("org", typeof(Organization))
108+
.AddJoin("emp", "org.employments")
109+
.AddScalar("regionCode", NHibernateUtil.String)
110+
.ListAsync());
111+
Assert.AreEqual(2, l.Count);
112+
113+
l = await (s.CreateSQLQuery(OrgEmpPersonSQL)
114+
.AddEntity("org", typeof(Organization))
115+
.AddJoin("emp", "org.employments")
116+
.AddJoin("pers", "emp.employee")
117+
.ListAsync());
118+
Assert.AreEqual(l.Count, 1);
104119

105-
IList l = await (s.CreateSQLQuery(OrgEmpRegionSQL)
106-
.AddEntity("org", typeof(Organization))
107-
.AddJoin("emp", "org.employments")
108-
.AddScalar("regionCode", NHibernateUtil.String)
109-
.ListAsync());
110-
Assert.AreEqual(2, l.Count);
120+
await (t.CommitAsync());
121+
}
111122

112-
l = await (s.CreateSQLQuery(OrgEmpPersonSQL)
113-
.AddEntity("org", typeof(Organization))
114-
.AddJoin("emp", "org.employments")
115-
.AddJoin("pers", "emp.employee")
116-
.ListAsync());
117-
Assert.AreEqual(l.Count, 1);
123+
using (var s = OpenSession())
124+
using (var t = s.BeginTransaction())
125+
{
126+
var l = await (s.CreateSQLQuery(
127+
"select {org.*}, {emp.*} " +
128+
"from ORGANIZATION org " +
129+
" left outer join EMPLOYMENT emp on org.ORGID = emp.EMPLOYER, ORGANIZATION org2")
130+
.AddEntity("org", typeof(Organization))
131+
.AddJoin("emp", "org.employments")
132+
.SetResultTransformer(new DistinctRootEntityResultTransformer())
133+
.ListAsync());
134+
Assert.AreEqual(l.Count, 2);
118135

119-
await (t.CommitAsync());
120-
s.Close();
136+
await (t.CommitAsync());
137+
s.Close();
138+
}
121139

122-
s = OpenSession();
123-
t = s.BeginTransaction();
140+
using (var s = OpenSession())
141+
using (var t = s.BeginTransaction())
142+
{
143+
await (s.DeleteAsync(emp));
144+
await (s.DeleteAsync(gavin));
145+
await (s.DeleteAsync(ifa));
146+
await (s.DeleteAsync(jboss));
124147

125-
l = await (s.CreateSQLQuery(
126-
"select {org.*}, {emp.*} " +
127-
"from ORGANIZATION org " +
128-
" left outer join EMPLOYMENT emp on org.ORGID = emp.EMPLOYER, ORGANIZATION org2")
129-
.AddEntity("org", typeof(Organization))
130-
.AddJoin("emp", "org.employments")
131-
.SetResultTransformer(new DistinctRootEntityResultTransformer())
132-
.ListAsync());
133-
Assert.AreEqual(l.Count, 2);
148+
await (t.CommitAsync());
149+
s.Close();
150+
}
151+
}
134152

135-
await (t.CommitAsync());
136-
s.Close();
153+
[Test]
154+
public async Task SQLQueryInterfaceCacheableAsync()
155+
{
156+
Organization ifa = new Organization("IFA");
157+
Organization jboss = new Organization("JBoss");
158+
Person gavin = new Person("Gavin");
159+
Employment emp = new Employment(gavin, jboss, "AU");
137160

138-
s = OpenSession();
139-
t = s.BeginTransaction();
161+
using (ISession s = OpenSession())
162+
using (ITransaction t = s.BeginTransaction())
163+
{
164+
await (s.SaveAsync(ifa));
165+
await (s.SaveAsync(jboss));
166+
await (s.SaveAsync(gavin));
167+
await (s.SaveAsync(emp));
168+
169+
IList l = await (s.CreateSQLQuery(OrgEmpRegionSQL)
170+
.AddEntity("org", typeof(Organization))
171+
.AddJoin("emp", "org.employments")
172+
.AddScalar("regionCode", NHibernateUtil.String)
173+
.SetCacheable(true)
174+
.ListAsync());
175+
Assert.AreEqual(2, l.Count);
176+
177+
l = await (s.CreateSQLQuery(OrgEmpPersonSQL)
178+
.AddEntity("org", typeof(Organization))
179+
.AddJoin("emp", "org.employments")
180+
.AddJoin("pers", "emp.employee")
181+
.SetCacheable(true)
182+
.ListAsync());
183+
Assert.AreEqual(l.Count, 1);
140184

141-
await (s.DeleteAsync(emp));
142-
await (s.DeleteAsync(gavin));
143-
await (s.DeleteAsync(ifa));
144-
await (s.DeleteAsync(jboss));
185+
await (t.CommitAsync());
186+
}
145187

146-
await (t.CommitAsync());
147-
s.Close();
188+
using (var s = OpenSession())
189+
using (var t = s.BeginTransaction())
190+
{
191+
var l = await (s.CreateSQLQuery(
192+
"select {org.*}, {emp.*} " +
193+
"from ORGANIZATION org " +
194+
" left outer join EMPLOYMENT emp on org.ORGID = emp.EMPLOYER, ORGANIZATION org2")
195+
.AddEntity("org", typeof(Organization))
196+
.AddJoin("emp", "org.employments")
197+
.SetCacheable(true)
198+
.SetResultTransformer(new DistinctRootEntityResultTransformer())
199+
.ListAsync());
200+
Assert.AreEqual(l.Count, 2);
201+
202+
await (t.CommitAsync());
203+
s.Close();
204+
}
205+
206+
using (var s = OpenSession())
207+
using (var t = s.BeginTransaction())
208+
{
209+
await (s.DeleteAsync(emp));
210+
await (s.DeleteAsync(gavin));
211+
await (s.DeleteAsync(ifa));
212+
await (s.DeleteAsync(jboss));
213+
214+
await (t.CommitAsync());
215+
s.Close();
216+
}
148217
}
149218

150219
[Test]

src/NHibernate.Test/SqlTest/Query/NativeSQLQueriesFixture.cs

Lines changed: 110 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -79,61 +79,130 @@ public void FailOnNoAddEntityOrScalar()
7979
[Test]
8080
public void SQLQueryInterface()
8181
{
82-
ISession s = OpenSession();
83-
ITransaction t = s.BeginTransaction();
8482
Organization ifa = new Organization("IFA");
8583
Organization jboss = new Organization("JBoss");
8684
Person gavin = new Person("Gavin");
8785
Employment emp = new Employment(gavin, jboss, "AU");
8886

89-
s.Save(ifa);
90-
s.Save(jboss);
91-
s.Save(gavin);
92-
s.Save(emp);
87+
using (ISession s = OpenSession())
88+
using (ITransaction t = s.BeginTransaction())
89+
{
90+
s.Save(ifa);
91+
s.Save(jboss);
92+
s.Save(gavin);
93+
s.Save(emp);
94+
95+
IList l = s.CreateSQLQuery(OrgEmpRegionSQL)
96+
.AddEntity("org", typeof(Organization))
97+
.AddJoin("emp", "org.employments")
98+
.AddScalar("regionCode", NHibernateUtil.String)
99+
.List();
100+
Assert.AreEqual(2, l.Count);
101+
102+
l = s.CreateSQLQuery(OrgEmpPersonSQL)
103+
.AddEntity("org", typeof(Organization))
104+
.AddJoin("emp", "org.employments")
105+
.AddJoin("pers", "emp.employee")
106+
.List();
107+
Assert.AreEqual(l.Count, 1);
93108

94-
IList l = s.CreateSQLQuery(OrgEmpRegionSQL)
95-
.AddEntity("org", typeof(Organization))
96-
.AddJoin("emp", "org.employments")
97-
.AddScalar("regionCode", NHibernateUtil.String)
98-
.List();
99-
Assert.AreEqual(2, l.Count);
109+
t.Commit();
110+
}
100111

101-
l = s.CreateSQLQuery(OrgEmpPersonSQL)
102-
.AddEntity("org", typeof(Organization))
103-
.AddJoin("emp", "org.employments")
104-
.AddJoin("pers", "emp.employee")
105-
.List();
106-
Assert.AreEqual(l.Count, 1);
112+
using (var s = OpenSession())
113+
using (var t = s.BeginTransaction())
114+
{
115+
var l = s.CreateSQLQuery(
116+
"select {org.*}, {emp.*} " +
117+
"from ORGANIZATION org " +
118+
" left outer join EMPLOYMENT emp on org.ORGID = emp.EMPLOYER, ORGANIZATION org2")
119+
.AddEntity("org", typeof(Organization))
120+
.AddJoin("emp", "org.employments")
121+
.SetResultTransformer(new DistinctRootEntityResultTransformer())
122+
.List();
123+
Assert.AreEqual(l.Count, 2);
107124

108-
t.Commit();
109-
s.Close();
125+
t.Commit();
126+
s.Close();
127+
}
110128

111-
s = OpenSession();
112-
t = s.BeginTransaction();
129+
using (var s = OpenSession())
130+
using (var t = s.BeginTransaction())
131+
{
132+
s.Delete(emp);
133+
s.Delete(gavin);
134+
s.Delete(ifa);
135+
s.Delete(jboss);
113136

114-
l = s.CreateSQLQuery(
115-
"select {org.*}, {emp.*} " +
116-
"from ORGANIZATION org " +
117-
" left outer join EMPLOYMENT emp on org.ORGID = emp.EMPLOYER, ORGANIZATION org2")
118-
.AddEntity("org", typeof(Organization))
119-
.AddJoin("emp", "org.employments")
120-
.SetResultTransformer(new DistinctRootEntityResultTransformer())
121-
.List();
122-
Assert.AreEqual(l.Count, 2);
137+
t.Commit();
138+
s.Close();
139+
}
140+
}
123141

124-
t.Commit();
125-
s.Close();
142+
[Test]
143+
public void SQLQueryInterfaceCacheable()
144+
{
145+
Organization ifa = new Organization("IFA");
146+
Organization jboss = new Organization("JBoss");
147+
Person gavin = new Person("Gavin");
148+
Employment emp = new Employment(gavin, jboss, "AU");
126149

127-
s = OpenSession();
128-
t = s.BeginTransaction();
150+
using (ISession s = OpenSession())
151+
using (ITransaction t = s.BeginTransaction())
152+
{
153+
s.Save(ifa);
154+
s.Save(jboss);
155+
s.Save(gavin);
156+
s.Save(emp);
157+
158+
IList l = s.CreateSQLQuery(OrgEmpRegionSQL)
159+
.AddEntity("org", typeof(Organization))
160+
.AddJoin("emp", "org.employments")
161+
.AddScalar("regionCode", NHibernateUtil.String)
162+
.SetCacheable(true)
163+
.List();
164+
Assert.AreEqual(2, l.Count);
165+
166+
l = s.CreateSQLQuery(OrgEmpPersonSQL)
167+
.AddEntity("org", typeof(Organization))
168+
.AddJoin("emp", "org.employments")
169+
.AddJoin("pers", "emp.employee")
170+
.SetCacheable(true)
171+
.List();
172+
Assert.AreEqual(l.Count, 1);
129173

130-
s.Delete(emp);
131-
s.Delete(gavin);
132-
s.Delete(ifa);
133-
s.Delete(jboss);
174+
t.Commit();
175+
}
134176

135-
t.Commit();
136-
s.Close();
177+
using (var s = OpenSession())
178+
using (var t = s.BeginTransaction())
179+
{
180+
var l = s.CreateSQLQuery(
181+
"select {org.*}, {emp.*} " +
182+
"from ORGANIZATION org " +
183+
" left outer join EMPLOYMENT emp on org.ORGID = emp.EMPLOYER, ORGANIZATION org2")
184+
.AddEntity("org", typeof(Organization))
185+
.AddJoin("emp", "org.employments")
186+
.SetCacheable(true)
187+
.SetResultTransformer(new DistinctRootEntityResultTransformer())
188+
.List();
189+
Assert.AreEqual(l.Count, 2);
190+
191+
t.Commit();
192+
s.Close();
193+
}
194+
195+
using (var s = OpenSession())
196+
using (var t = s.BeginTransaction())
197+
{
198+
s.Delete(emp);
199+
s.Delete(gavin);
200+
s.Delete(ifa);
201+
s.Delete(jboss);
202+
203+
t.Commit();
204+
s.Close();
205+
}
137206
}
138207

139208
[Test]

src/NHibernate/Loader/Custom/CustomLoader.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ public CustomLoader(ICustomQuery customQuery, ISessionFactoryImplementor factory
179179
transformerAliases = specifiedAliases.ToArray();
180180
rowProcessor = new ResultRowProcessor(hasScalars, resultColumnProcessors.ToArray());
181181
includeInResultRow = includeInResultRowList.ToArray();
182+
ResultRowAliases = transformerAliases.Where((a, i) => includeInResultRowList[i]).ToArray();
182183
}
183184

184185
public ISet<string> QuerySpaces
@@ -297,7 +298,7 @@ protected override object[] GetResultRow(object[] row, DbDataReader rs, ISession
297298
return rowProcessor.BuildResultRow(row, rs, session);
298299
}
299300

300-
protected override string[] ResultRowAliases => transformerAliases;
301+
protected override string[] ResultRowAliases { get; }
301302

302303
protected override IResultTransformer ResolveResultTransformer(IResultTransformer resultTransformer)
303304
{

0 commit comments

Comments
 (0)