Skip to content

Commit 62b9946

Browse files
committed
Refactored some custom SQL tests and added test case for mixed use of column names and manual aliases in custom SQL queries.
1 parent 55e3e20 commit 62b9946

File tree

2 files changed

+127
-85
lines changed

2 files changed

+127
-85
lines changed

src/NHibernate.Test/SqlTest/Query/NativeSQLQueries.hbm.xml

Lines changed: 54 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
<generator class="increment"/>
2828
</id>
2929
<property name="name" column="NAME" not-null="true"/>
30-
3130
</class>
3231

3332
<class name="Employment" table="EMPLOYMENT">
@@ -116,7 +115,6 @@
116115
<return-join alias="pers" property="emp.employee"/>
117116
</resultset>
118117

119-
120118
<resultset name="org-description">
121119
<return alias="org" class="Organization"/>
122120
<return-join alias="emp" property="org.employments"/>
@@ -204,56 +202,75 @@
204202
ORDER BY STARTDATE ASC, EMPLOYEE ASC
205203
</sql-query>
206204

207-
<sql-query name="organizationreturnproperty">
205+
<sql-query name="organization-using-manual-aliases">
208206
<return alias="org" class="Organization">
209-
<return-property name="id" column="ORGID"/>
210-
<return-property name="name" column="NAME"/>
207+
<return-property name="id" column="org_id"/>
208+
<return-property name="name" column="org_name"/>
211209
</return>
212210
<return-join alias="emp" property="org.employments">
213-
<return-property name="key" column="EMPLOYER"/>
214-
<return-property name="element" column="EMPID"/>
215-
<return-property name="element.employee" column="EMPLOYEE"/>
216-
<return-property name="element.employer" column="EMPLOYER"/>
217-
<return-property name="element.startDate" column="XSTARTDATE"/>
218-
<return-property name="element.endDate" column="ENDDATE"/>
219-
<return-property name="element.regionCode" column="REGIONCODE"/>
220-
<return-property name="element.employmentId" column="EMPID"/>
211+
<return-property name="key" column="emp_employer"/>
212+
<return-property name="element" column="emp_id"/>
213+
<return-property name="element.employee" column="emp_employee"/>
214+
<return-property name="element.employer" column="emp_employer"/>
215+
<return-property name="element.startDate" column="emp_startDate"/>
216+
<return-property name="element.endDate" column="emp_endDate"/>
217+
<return-property name="element.regionCode" column="emp_regionCode"/>
218+
<return-property name="element.employmentId" column="emp_id"/>
221219
<return-property name="element.salary">
222-
<return-column name="AVALUE"/>
223-
<return-column name="CURRENCY"/>
220+
<return-column name="emp_avalue"/>
221+
<return-column name="emp_currency"/>
224222
</return-property>
225223
</return-join>
226-
SELECT org.ORGID as orgid,
227-
org.NAME as name,
228-
emp.EMPLOYER as employer,
229-
emp.EMPID as empid,
230-
emp.EMPLOYEE as employee,
231-
emp.EMPLOYER as employer,
232-
emp.STARTDATE as xstartDate,
233-
emp.ENDDATE as endDate,
234-
emp.REGIONCODE as regionCode,
235-
emp.AVALUE as AVALUE,
236-
emp.CURRENCY as CURRENCY
224+
SELECT org.ORGID as org_id,
225+
org.NAME as org_name,
226+
emp.EMPLOYER as emp_employer,
227+
emp.EMPID as emp_id,
228+
emp.EMPLOYEE as emp_employee,
229+
emp.STARTDATE as emp_startDate,
230+
emp.ENDDATE as emp_endDate,
231+
emp.REGIONCODE as emp_regionCode,
232+
emp.AVALUE as emp_avalue,
233+
emp.CURRENCY as emp_currency
237234
FROM ORGANIZATION org
238235
LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER
239236
</sql-query>
240237

241-
242-
<sql-query name="organizationautodetect" resultset-ref="org-description">
238+
<sql-query name="organization-using-column-names" resultset-ref="org-description">
243239
<!-- equal to "organizationpropertyreturn" but since no {} nor return-property are used hibernate will fallback to use the columns directly from the mapping -->
244-
SELECT org.ORGID as orgid,
245-
org.NAME as name,
246-
emp.EMPLOYER as employer,
247-
emp.EMPID as empid,
248-
emp.EMPLOYEE as employee,
249-
emp.EMPLOYER as employer,
250-
emp.STARTDATE as startDate,
251-
emp.ENDDATE as endDate,
252-
emp.REGIONCODE as regionCode,
240+
SELECT org.ORGID as ORGID,
241+
org.NAME as NAME,
242+
emp.EMPLOYER as EMPLOYER,
243+
emp.EMPID as EMPID,
244+
emp.EMPLOYEE as EMPLOYEE,
245+
emp.STARTDATE as STARTDATE,
246+
emp.ENDDATE as ENDDATE,
247+
emp.REGIONCODE as REGIONCODE,
253248
emp.AVALUE as AVALUE,
254249
emp.CURRENCY as CURRENCY
255250
FROM ORGANIZATION org
256251
LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER
257252
</sql-query>
258253

254+
<sql-query name="organization-using-column-names-and-manual-aliases">
255+
<!-- equal to "organizationpropertyreturn" but will default to use columns directly from the mapping for properties without return-property element -->
256+
<return alias="org" class="Organization">
257+
<return-property name="id" column="ORGANISATION_ID"/>
258+
</return>
259+
<return-join alias="emp" property="org.employments">
260+
<return-property name="element" column="EMPLOYMENT_ID"/>
261+
<return-property name="element.id" column="EMPLOYMENT_ID"/>
262+
</return-join>
263+
SELECT org.ORGID as ORGANISATION_ID,
264+
org.NAME as NAME,
265+
emp.EMPID as EMPLOYMENT_ID,
266+
emp.EMPLOYEE as EMPLOYEE,
267+
emp.EMPLOYER as EMPLOYER,
268+
emp.STARTDATE as STARTDATE,
269+
emp.ENDDATE as ENDDATE,
270+
emp.REGIONCODE as REGIONCODE,
271+
emp.AVALUE as AVALUE,
272+
emp.CURRENCY as CURRENCY
273+
FROM ORGANIZATION org
274+
LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER
275+
</sql-query>
259276
</hibernate-mapping>

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

Lines changed: 73 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,14 @@
1+
using System;
12
using System.Collections;
3+
using NHibernate.Criterion;
24
using NHibernate.Transform;
35
using NUnit.Framework;
4-
using NHibernate.Criterion;
56

67
namespace NHibernate.Test.SqlTest.Query
78
{
89
[TestFixture]
910
public class GeneralTest : TestCase
1011
{
11-
protected const string OrganizationFetchJoinEmploymentSQL =
12-
"SELECT org.ORGID as {org.id}, " +
13-
" org.NAME as {org.name}, " +
14-
" emp.EMPLOYER as {emp.key}, " +
15-
" emp.EMPID as {emp.element}, " +
16-
" {emp.element.*} " +
17-
"FROM ORGANIZATION org " +
18-
" LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER";
19-
20-
protected const string OrganizationJoinEmploymentSQL =
21-
"SELECT org.ORGID as {org.id}, " +
22-
" org.NAME as {org.name}, " +
23-
" {emp.*} " +
24-
"FROM ORGANIZATION org " +
25-
" LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER";
26-
2712
protected const string EmploymentSQL = "SELECT * FROM EMPLOYMENT";
2813

2914
protected string EmploymentSQLMixedScalarEntity =
@@ -452,9 +437,9 @@ public void AutoDetectAliasing()
452437

453438
// TODO H3: H3.2 can guess the return column type so they can use just addScalar("employerid"),
454439
// but NHibernate currently can't do it.
455-
list =
456-
s.CreateSQLQuery(EmploymentSQLMixedScalarEntity).AddScalar("employerid", NHibernateUtil.Int64).AddEntity(
457-
typeof(Employment)).List();
440+
list = s.CreateSQLQuery(EmploymentSQLMixedScalarEntity)
441+
.AddScalar("employerid", NHibernateUtil.Int64)
442+
.AddEntity(typeof(Employment)).List();
458443
Assert.AreEqual(1, list.Count);
459444
o = (object[]) list[0];
460445
Assert.AreEqual(2, o.Length);
@@ -467,34 +452,6 @@ public void AutoDetectAliasing()
467452
list = queryWithCollection.List();
468453
Assert.AreEqual(list.Count, 1);
469454

470-
s.Clear();
471-
472-
list = s.CreateSQLQuery(OrganizationJoinEmploymentSQL)
473-
.AddEntity("org", typeof(Organization))
474-
.AddJoin("emp", "org.employments")
475-
.List();
476-
Assert.AreEqual(2, list.Count);
477-
478-
s.Clear();
479-
480-
list = s.CreateSQLQuery(OrganizationFetchJoinEmploymentSQL)
481-
.AddEntity("org", typeof(Organization))
482-
.AddJoin("emp", "org.employments")
483-
.List();
484-
Assert.AreEqual(2, list.Count);
485-
486-
s.Clear();
487-
488-
// TODO : why twice?
489-
s.GetNamedQuery("organizationreturnproperty").List();
490-
list = s.GetNamedQuery("organizationreturnproperty").List();
491-
Assert.AreEqual(2, list.Count);
492-
493-
s.Clear();
494-
495-
list = s.GetNamedQuery("organizationautodetect").List();
496-
Assert.AreEqual(2, list.Count);
497-
498455
t.Commit();
499456
s.Close();
500457

@@ -538,6 +495,74 @@ public void AutoDetectAliasing()
538495
s.Close();
539496
}
540497

498+
public void CanQueryWithGeneratedAliasesOnly_UsingWildcard()
499+
{
500+
const string SQL =
501+
"SELECT org.ORGID as {org.id}, " +
502+
" org.NAME as {org.name}, " +
503+
" {emp.*} " +
504+
"FROM ORGANIZATION org " +
505+
" LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER";
506+
507+
VerifyOrganisationQuery(session => session.CreateSQLQuery(SQL)
508+
.AddEntity("org", typeof(Organization))
509+
.AddJoin("emp", "org.employments"));
510+
}
511+
512+
[Test]
513+
public void CanQueryWithGeneratedAliasesOnly_UsingCollectionElementWildcard()
514+
{
515+
const string SQL =
516+
"SELECT org.ORGID as {org.id}, " +
517+
" org.NAME as {org.name}, " +
518+
" emp.EMPLOYER as {emp.key}, " +
519+
" emp.EMPID as {emp.element}, " +
520+
" {emp.element.*} " +
521+
"FROM ORGANIZATION org " +
522+
" LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER";
523+
524+
VerifyOrganisationQuery(session => session.CreateSQLQuery(SQL)
525+
.AddEntity("org", typeof(Organization))
526+
.AddJoin("emp", "org.employments"));
527+
}
528+
529+
[Test]
530+
public void CanQueryWithColumnNamesOnly()
531+
{
532+
VerifyOrganisationQuery(session => session.GetNamedQuery("organization-using-manual-aliases"));
533+
}
534+
535+
[Test]
536+
public void CanQueryWithManualAliasesOnly()
537+
{
538+
VerifyOrganisationQuery(session => session.GetNamedQuery("organization-using-column-names"));
539+
}
540+
541+
[Test]
542+
public void CanQueryWithMixOfColumnNamesAndManualAliases()
543+
{
544+
VerifyOrganisationQuery(session => session.GetNamedQuery("organization-using-column-names-and-manual-aliases"));
545+
}
546+
547+
private void VerifyOrganisationQuery(Func<ISession, IQuery> queryFactory, string message = null)
548+
{
549+
using (ISession s = OpenSession())
550+
using (ITransaction t = s.BeginTransaction())
551+
{
552+
var ifa = new Organization("IFA");
553+
var jboss = new Organization("JBoss");
554+
var gavin = new Person("Gavin");
555+
var emp = new Employment(gavin, jboss, "AU");
556+
s.Save(jboss);
557+
s.Save(ifa);
558+
s.Save(gavin);
559+
s.Save(emp);
560+
561+
var list = queryFactory(s).List();
562+
Assert.AreEqual(2, list.Count, message);
563+
}
564+
}
565+
541566
[Test]
542567
public void MixAndMatchEntityScalar()
543568
{

0 commit comments

Comments
 (0)