|
From: <fab...@us...> - 2009-02-08 12:46:26
|
Revision: 4071
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4071&view=rev
Author: fabiomaulo
Date: 2009-02-08 12:46:06 +0000 (Sun, 08 Feb 2009)
Log Message:
-----------
Reorganization of Tests about custom queries
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/SqlTest/Custom/
trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/
trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/Item.cs
trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/Item.hbm.xml
trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/NativeSQLQueries.hbm.xml
trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/NativeSQLQueriesFixture.cs
trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/SelfReferencingCollectionLoadTest.cs
Removed Paths:
-------------
trunk/nhibernate/src/NHibernate.Test/SqlTest/General.hbm.xml
trunk/nhibernate/src/NHibernate.Test/SqlTest/GeneralTest.cs
trunk/nhibernate/src/NHibernate.Test/SqlTest/Item.cs
trunk/nhibernate/src/NHibernate.Test/SqlTest/Item.hbm.xml
trunk/nhibernate/src/NHibernate.Test/SqlTest/SelfReferencingCollectionLoadTest.cs
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-02-07 22:32:27 UTC (rev 4070)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-02-08 12:46:06 UTC (rev 4071)
@@ -951,10 +951,10 @@
<Compile Include="SqlTest\Dimension.cs" />
<Compile Include="SqlTest\Employment.cs" />
<Compile Include="SqlTest\FireBirdTest.cs" />
- <Compile Include="SqlTest\GeneralTest.cs" />
+ <Compile Include="SqlTest\Query\NativeSQLQueriesFixture.cs" />
<Compile Include="SqlTest\HandSQLTest.cs" />
<Compile Include="SqlTest\IdentityInsertWithStoredProcsTest.cs" />
- <Compile Include="SqlTest\Item.cs" />
+ <Compile Include="SqlTest\Query\Item.cs" />
<Compile Include="SqlTest\MonetaryAmount.cs" />
<Compile Include="SqlTest\MonetaryAmountUserType.cs" />
<Compile Include="SqlTest\MSSQLIdentityInsertWithStoredProcsTest.cs" />
@@ -964,7 +964,7 @@
<Compile Include="SqlTest\Organization.cs" />
<Compile Include="SqlTest\Person.cs" />
<Compile Include="SqlTest\Product.cs" />
- <Compile Include="SqlTest\SelfReferencingCollectionLoadTest.cs" />
+ <Compile Include="SqlTest\Query\SelfReferencingCollectionLoadTest.cs" />
<Compile Include="SqlTest\SpaceShip.cs" />
<Compile Include="SqlTest\Speech.cs" />
<Compile Include="Stateless\Document.cs" />
@@ -1255,7 +1255,7 @@
<EmbeddedResource Include="SqlTest\MSSQLEmployment.hbm.xml" />
</ItemGroup>
<ItemGroup>
- <EmbeddedResource Include="SqlTest\General.hbm.xml" />
+ <EmbeddedResource Include="SqlTest\Query\NativeSQLQueries.hbm.xml" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="NHSpecificTest\NH719\Mappings.hbm.xml" />
@@ -1343,7 +1343,7 @@
<EmbeddedResource Include="NHSpecificTest\NH776\Mappings.hbm.xml" />
</ItemGroup>
<ItemGroup>
- <EmbeddedResource Include="SqlTest\Item.hbm.xml" />
+ <EmbeddedResource Include="SqlTest\Query\Item.hbm.xml" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Criteria\Enrolment.hbm.xml" />
@@ -1770,6 +1770,7 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Properties\" />
+ <Folder Include="SqlTest\Custom\" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
@@ -1787,4 +1788,4 @@
if exist "$(ProjectDir)hibernate.cfg.xml" (copy "$(ProjectDir)hibernate.cfg.xml" "hibernate.cfg.xml")
copy /y "..\..\..\NHibernate.DomainModel\ABC.hbm.xml" "ABC.hbm.xml"</PostBuildEvent>
</PropertyGroup>
-</Project>
+</Project>
\ No newline at end of file
Deleted: trunk/nhibernate/src/NHibernate.Test/SqlTest/General.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/SqlTest/General.hbm.xml 2009-02-07 22:32:27 UTC (rev 4070)
+++ trunk/nhibernate/src/NHibernate.Test/SqlTest/General.hbm.xml 2009-02-08 12:46:06 UTC (rev 4071)
@@ -1,263 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!--
-
- This mapping demonstrates the use of Hibernate with
- all-handwritten SQL!
-
- This version is for Sybase/mssql
--->
-
-<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="field.camelcase"
- namespace="NHibernate.Test.SqlTest"
- assembly="NHibernate.Test">
-
- <class name="Organization" table="ORGANIZATION">
- <id name="id" unsaved-value="0" column="ORGID">
- <generator class="increment"/>
- </id>
- <property name="name" column="NAME" not-null="true"/>
- <set lazy="true" name="employments"
- inverse="true">
- <key column="EMPLOYER"/>
- <!-- only needed for DDL generation -->
- <one-to-many class="Employment"/>
- </set>
- </class>
-
- <class name="Person" table="PERSON">
- <id name="id" unsaved-value="0" column="PERID">
- <generator class="increment"/>
- </id>
- <property name="name" column="NAME" not-null="true"/>
-
- </class>
-
- <class name="Employment" table="EMPLOYMENT">
- <id name="employmentId" unsaved-value="0" column="EMPID">
- <generator class="increment"/>
- </id>
- <many-to-one name="employee" column="EMPLOYEE" not-null="true" update="false"/>
- <many-to-one name="employer" column="EMPLOYER" not-null="true" update="false"/>
- <property name="startDate" column="STARTDATE" not-null="false" type="NHibernate.Test.SqlTest.NullDateUserType, NHibernate.Test" />
- <property name="endDate" column="ENDDATE" insert="false" type="NHibernate.Test.SqlTest.NullDateUserType, NHibernate.Test" />
- <property name="regionCode" column="REGIONCODE" update="false"/>
- <property name="salary" type="NHibernate.Test.SqlTest.MonetaryAmountUserType, NHibernate.Test">
- <column name="AVALUE" sql-type="float"/>
- <column name="CURRENCY"/>
- </property>
- </class>
-
- <class name="Order" table="TBL_ORDER">
- <composite-id name="orderId" class="Order+OrderIdType">
- <key-property name="orgid"/>
- <key-property name="ordernumber"/>
- </composite-id>
-
- <many-to-one name="product">
- <column name="PROD_ORGID"/>
- <column name="PROD_NO"/>
- </many-to-one>
- <many-to-one name="person"/>
- </class>
-
- <class name="Product">
- <composite-id name="productId" class="Product+ProductIdType">
- <key-property name="orgid"/>
- <key-property name="productnumber"/>
- </composite-id>
-
- <property name="name"/>
-
- <set name="orders" inverse="true">
- <key>
- <column name="PROD_ORGID"/>
- <column name="PROD_NO"/>
- </key>
- <one-to-many class="Order"/>
- </set>
- </class>
-
- <class name="Dimension">
- <id name="id" type="long">
- <generator class="increment"/>
- </id>
- <property name="length" column="d_len"/>
- <property name="width" column="d_width"/>
- </class>
-
- <class name="SpaceShip">
- <id name="id" type="integer">
- <generator class="increment"/>
- </id>
- <property name="name" column="fld_name"/>
- <property name="model" column="fld_model"/>
- <property name="speed" column="fld_speed"/>
- <component name="dimensions">
- <property name="length" column="fld_length"/>
- <property name="width" column="fld_width"/>
- </component>
- </class>
-
- <class name="Speech">
- <id name="id" type="integer">
- <generator class="increment"/>
- </id>
- <property name="name" column="name"/>
- <property name="length" column="flength"/>
- </class>
-
- <resultset name="org-emp-regionCode">
- <return-scalar column="regionCode" type="string"/>
- <return alias="org" class="Organization"/>
- <return-join alias="emp" property="org.employments"/>
- </resultset>
-
- <resultset name="org-emp-person">
- <return alias="org" class="Organization"/>
- <return-join alias="emp" property="org.employments"/>
- <return-join alias="pers" property="emp.employee"/>
- </resultset>
-
-
- <resultset name="org-description">
- <return alias="org" class="Organization"/>
- <return-join alias="emp" property="org.employments"/>
- </resultset>
-
- <resultset name="spaceship-vol">
- <return alias="sps" class="SpaceShip">
- <return-property name="id" column="id"/>
- <return-property name="name" column="name"/>
- <return-property name="model" column="model"/>
- <return-property name="speed" column="speed"/>
- <return-property name="dimensions.length" column="length"/>
- <return-property name="dimensions.width" column="width"/>
- </return>
- <return-scalar column="surface" type="double" />
- <return-scalar column="volume" type="double" />
- </resultset>
-
- <resultset name="speech">
- <return alias="sp" class="Speech">
- <return-property name="id" column="id"/>
- <return-property name="name" column="name"/>
- <return-property name="length" column="flength"/>
- </return>
- <return-scalar column="scalarName" type="string" />
- </resultset>
-
- <sql-query name="spaceship" resultset-ref="spaceship-vol">
- select id as id,
- fld_name as name,
- fld_model as model,
- fld_speed as speed,
- fld_length as flength,
- fld_width as width,
- fld_length * fld_width as surface,
- fld_length * fld_width *10 as volume
- from SpaceShip
- </sql-query>
-
- <sql-query name="orgNamesOnly">
- <return-scalar column="NAME" type="string"/>
- SELECT org.NAME FROM ORGANIZATION org
- </sql-query>
-
- <sql-query name="orgNamesAndOrgs">
- <return-scalar column="thename" type="string"/>
- <return alias="org" class="Organization"/>
- SELECT org.NAME AS thename, org.NAME AS {org.name}, org.ORGID AS {org.id}
- FROM ORGANIZATION org
- ORDER BY thename
- </sql-query>
-
- <sql-query name="orgsAndOrgNames">
- <return alias="org" class="Organization"/>
- <return-scalar column="thename" type="string"/>
- SELECT org.NAME AS thename, org.NAME AS {org.name}, org.ORGID AS {org.id}
- FROM ORGANIZATION org
- ORDER BY thename
- </sql-query>
-
- <sql-query name="orgIdsAndOrgNames">
- <return-scalar column="orgid" type="long"/>
- <return-scalar column="thename" type="string"/>
- SELECT NAME AS thename, ORGID AS orgid
- FROM ORGANIZATION
- ORDER BY thename
- </sql-query>
-
- <sql-query name="AllEmploymentAsMapped">
- <return class="Employment"/>
- SELECT * FROM EMPLOYMENT
- </sql-query>
-
- <sql-query name="EmploymentAndPerson">
- <return class="Employment"/>
- <return class="Person"/>
- SELECT * FROM EMPLOYMENT, PERSON
- </sql-query>
-
- <sql-query name="organizationEmploymentsExplicitAliases">
- <load-collection alias="empcol" role="Organization.employments"/>
- SELECT empcol.EMPLOYER as {empcol.key}, empcol.EMPID as {empcol.element}, {empcol.element.*}
- FROM EMPLOYMENT empcol
- WHERE EMPLOYER = :id
- ORDER BY STARTDATE ASC, EMPLOYEE ASC
- </sql-query>
-
- <sql-query name="organizationreturnproperty">
- <return alias="org" class="Organization">
- <return-property name="id" column="ORGID"/>
- <return-property name="name" column="NAME"/>
- </return>
- <return-join alias="emp" property="org.employments">
- <return-property name="key" column="EMPLOYER"/>
- <return-property name="element" column="EMPID"/>
- <return-property name="element.employee" column="EMPLOYEE"/>
- <return-property name="element.employer" column="EMPLOYER"/>
- <return-property name="element.startDate" column="XSTARTDATE"/>
- <return-property name="element.endDate" column="ENDDATE"/>
- <return-property name="element.regionCode" column="REGIONCODE"/>
- <return-property name="element.employmentId" column="EMPID"/>
- <return-property name="element.salary">
- <return-column name="AVALUE"/>
- <return-column name="CURRENCY"/>
- </return-property>
- </return-join>
- SELECT org.ORGID as orgid,
- org.NAME as name,
- emp.EMPLOYER as employer,
- emp.EMPID as empid,
- emp.EMPLOYEE as employee,
- emp.EMPLOYER as employer,
- emp.STARTDATE as xstartDate,
- emp.ENDDATE as endDate,
- emp.REGIONCODE as regionCode,
- emp.AVALUE as AVALUE,
- emp.CURRENCY as CURRENCY
- FROM ORGANIZATION org
- LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER
- </sql-query>
-
-
- <sql-query name="organizationautodetect" resultset-ref="org-description">
- <!-- equal to "organizationpropertyreturn" but since no {} nor return-property are used hibernate will fallback to use the columns directly from the mapping -->
- <return alias="org" class="Organization"/>
- <return-join alias="emp" property="org.employments"/>
- SELECT org.ORGID as orgid,
- org.NAME as name,
- emp.EMPLOYER as employer,
- emp.EMPID as empid,
- emp.EMPLOYEE as employee,
- emp.EMPLOYER as employer,
- emp.STARTDATE as startDate,
- emp.ENDDATE as endDate,
- emp.REGIONCODE as regionCode,
- emp.AVALUE as AVALUE,
- emp.CURRENCY as CURRENCY
- FROM ORGANIZATION org
- LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER
- </sql-query>
-
-</hibernate-mapping>
Deleted: trunk/nhibernate/src/NHibernate.Test/SqlTest/GeneralTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/SqlTest/GeneralTest.cs 2009-02-07 22:32:27 UTC (rev 4070)
+++ trunk/nhibernate/src/NHibernate.Test/SqlTest/GeneralTest.cs 2009-02-08 12:46:06 UTC (rev 4071)
@@ -1,601 +0,0 @@
-using System;
-using System.Collections;
-using NHibernate.Transform;
-using NUnit.Framework;
-using NHibernate.Criterion;
-
-namespace NHibernate.Test.SqlTest
-{
- [TestFixture]
- public class GeneralTest : TestCase
- {
- protected const string OrganizationFetchJoinEmploymentSQL =
- "SELECT org.ORGID as {org.id}, " +
- " org.NAME as {org.name}, " +
- " emp.EMPLOYER as {emp.key}, " +
- " emp.EMPID as {emp.element}, " +
- " {emp.element.*} " +
- "FROM ORGANIZATION org " +
- " LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER";
-
- protected const string OrganizationJoinEmploymentSQL =
- "SELECT org.ORGID as {org.id}, " +
- " org.NAME as {org.name}, " +
- " {emp.*} " +
- "FROM ORGANIZATION org " +
- " LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER";
-
- protected const string EmploymentSQL = "SELECT * FROM EMPLOYMENT";
-
- protected string EmploymentSQLMixedScalarEntity =
- "SELECT e.*, e.employer as employerid FROM EMPLOYMENT e";
-
- protected const string OrgEmpRegionSQL =
- "select {org.*}, {emp.*}, emp.REGIONCODE " +
- "from ORGANIZATION org " +
- " left outer join EMPLOYMENT emp on org.ORGID = emp.EMPLOYER";
-
- protected string OrgEmpPersonSQL =
- "select {org.*}, {emp.*}, {pers.*} " +
- "from ORGANIZATION org " +
- " join EMPLOYMENT emp on org.ORGID = emp.EMPLOYER " +
- " join PERSON pers on pers.PERID = emp.EMPLOYEE ";
-
- protected override IList Mappings
- {
- get { return new string[] {"SqlTest.General.hbm.xml"}; }
- }
-
- protected override string MappingsAssembly
- {
- get { return "NHibernate.Test"; }
- }
-
- [Test]
- public void FailOnNoAddEntityOrScalar()
- {
- // Note: this passes, but for the wrong reason.
- // there is actually an exception thrown, but it is the database
- // throwing a sql exception because the SQL gets passed
- // "un-processed"...
- ISession s = OpenSession();
- try
- {
- string sql = "select {org.*} " +
- "from organization org";
- s.CreateSQLQuery(sql).List();
- Assert.Fail("Should throw an exception since no AddEntity nor AddScalar has been performed.");
- }
- catch (HibernateException)
- {
- // expected behavior
- }
- finally
- {
- s.Close();
- }
- }
-
- [Test]
- public void SQLQueryInterface()
- {
- ISession s = OpenSession();
- ITransaction t = s.BeginTransaction();
- Organization ifa = new Organization("IFA");
- Organization jboss = new Organization("JBoss");
- Person gavin = new Person("Gavin");
- Employment emp = new Employment(gavin, jboss, "AU");
-
- s.Save(ifa);
- s.Save(jboss);
- s.Save(gavin);
- s.Save(emp);
-
- IList l = s.CreateSQLQuery(OrgEmpRegionSQL)
- .AddEntity("org", typeof(Organization))
- .AddJoin("emp", "org.employments")
- .AddScalar("regionCode", NHibernateUtil.String)
- .List();
- Assert.AreEqual(2, l.Count);
-
- l = s.CreateSQLQuery(OrgEmpPersonSQL)
- .AddEntity("org", typeof(Organization))
- .AddJoin("emp", "org.employments")
- .AddJoin("pers", "emp.employee")
- .List();
- Assert.AreEqual(l.Count, 1);
-
- t.Commit();
- s.Close();
-
- s = OpenSession();
- t = s.BeginTransaction();
-
- l = s.CreateSQLQuery("select {org.*}, {emp.*} " +
- "from ORGANIZATION org " +
- " left outer join EMPLOYMENT emp on org.ORGID = emp.EMPLOYER, ORGANIZATION org2")
- .AddEntity("org", typeof(Organization))
- .AddJoin("emp", "org.employments")
- .SetResultTransformer(new DistinctRootEntityResultTransformer())
- .List();
- Assert.AreEqual(l.Count, 2);
-
- t.Commit();
- s.Close();
-
- s = OpenSession();
- t = s.BeginTransaction();
-
- s.Delete(emp);
- s.Delete(gavin);
- s.Delete(ifa);
- s.Delete(jboss);
-
- t.Commit();
- s.Close();
- }
-
- [Test]
- public void ResultSetMappingDefinition()
- {
- ISession s = OpenSession();
- ITransaction t = s.BeginTransaction();
- Organization ifa = new Organization("IFA");
- Organization jboss = new Organization("JBoss");
- Person gavin = new Person("Gavin");
- Employment emp = new Employment(gavin, jboss, "AU");
-
- s.Save(ifa);
- s.Save(jboss);
- s.Save(gavin);
- s.Save(emp);
-
- IList l = s.CreateSQLQuery(OrgEmpRegionSQL)
- .SetResultSetMapping("org-emp-regionCode")
- .List();
- Assert.AreEqual(l.Count, 2);
-
- l = s.CreateSQLQuery(OrgEmpPersonSQL)
- .SetResultSetMapping("org-emp-person")
- .List();
- Assert.AreEqual(l.Count, 1);
-
- s.Delete(emp);
- s.Delete(gavin);
- s.Delete(ifa);
- s.Delete(jboss);
-
- t.Commit();
- s.Close();
- }
-
- [Test]
- public void ScalarValues()
- {
- ISession s = OpenSession();
- ITransaction t = s.BeginTransaction();
-
- Organization ifa = new Organization("IFA");
- Organization jboss = new Organization("JBoss");
-
- object idIfa = s.Save(ifa);
- object idJBoss = s.Save(jboss);
-
- s.Flush();
-
- IList result = s.GetNamedQuery("orgNamesOnly").List();
- Assert.IsTrue(result.Contains("IFA"));
- Assert.IsTrue(result.Contains("JBoss"));
-
- result = s.GetNamedQuery("orgNamesOnly").SetResultTransformer(CriteriaSpecification.AliasToEntityMap).List();
- IDictionary m = (IDictionary) result[0];
- Assert.AreEqual(2, result.Count);
- Assert.AreEqual(1, m.Count);
- Assert.IsTrue(m.Contains("NAME"));
-
- t.Commit();
- s.Close();
-
- s = OpenSession();
- t = s.BeginTransaction();
-
- IEnumerator iter = s.GetNamedQuery("orgNamesAndOrgs").List().GetEnumerator();
- iter.MoveNext();
- object[] o = (object[]) iter.Current;
- Assert.AreEqual(o[0], "IFA");
- Assert.AreEqual(((Organization) o[1]).Name, "IFA");
- iter.MoveNext();
- o = (object[]) iter.Current;
- Assert.AreEqual(o[0], "JBoss");
- Assert.AreEqual(((Organization) o[1]).Name, "JBoss");
-
- t.Commit();
- s.Close();
-
- s = OpenSession();
- t = s.BeginTransaction();
-
- // test that the ordering of the results is truly based on the order in which they were defined
- iter = s.GetNamedQuery("orgsAndOrgNames").List().GetEnumerator();
- iter.MoveNext();
- object[] row = (object[]) iter.Current;
- Assert.AreEqual(typeof(Organization), row[0].GetType(), "expecting non-scalar result first");
- Assert.AreEqual(typeof(string), row[1].GetType(), "expecting scalar result second");
- Assert.AreEqual("IFA", ((Organization) row[0]).Name);
- Assert.AreEqual(row[1], "IFA");
- iter.MoveNext();
- row = (object[]) iter.Current;
- Assert.AreEqual(typeof(Organization), row[0].GetType(), "expecting non-scalar result first");
- Assert.AreEqual(typeof(string), row[1].GetType(), "expecting scalar result second");
- Assert.AreEqual(((Organization) row[0]).Name, "JBoss");
- Assert.AreEqual(row[1], "JBoss");
- Assert.IsFalse(iter.MoveNext());
-
- t.Commit();
- s.Close();
-
- s = OpenSession();
- t = s.BeginTransaction();
-
- iter = s.GetNamedQuery("orgIdsAndOrgNames").List().GetEnumerator();
- iter.MoveNext();
- o = (object[]) iter.Current;
- Assert.AreEqual(o[1], "IFA");
- Assert.AreEqual(o[0], idIfa);
- iter.MoveNext();
- o = (object[]) iter.Current;
- Assert.AreEqual(o[1], "JBoss");
- Assert.AreEqual(o[0], idJBoss);
-
- s.Delete(ifa);
- s.Delete(jboss);
- t.Commit();
- s.Close();
- }
-
- [Test]
- public void MappedAliasStrategy()
- {
- ISession s = OpenSession();
- ITransaction t = s.BeginTransaction();
- Organization ifa = new Organization("IFA");
- Organization jboss = new Organization("JBoss");
- Person gavin = new Person("Gavin");
- Employment emp = new Employment(gavin, jboss, "AU");
- s.Save(jboss);
- s.Save(ifa);
- s.Save(gavin);
- s.Save(emp);
- t.Commit();
- s.Close();
-
- s = OpenSession();
- t = s.BeginTransaction();
- IQuery namedQuery = s.GetNamedQuery("AllEmploymentAsMapped");
- IList list = namedQuery.List();
- Assert.AreEqual(1, list.Count);
- Employment emp2 = (Employment) list[0];
- Assert.AreEqual(emp2.EmploymentId, emp.EmploymentId);
- Assert.AreEqual(emp2.StartDate.Date, emp.StartDate.Date);
- Assert.AreEqual(emp2.EndDate, emp.EndDate);
- t.Commit();
- s.Close();
-
- s = OpenSession();
- t = s.BeginTransaction();
- IQuery sqlQuery = s.GetNamedQuery("EmploymentAndPerson");
- sqlQuery.SetResultTransformer(CriteriaSpecification.AliasToEntityMap);
- list = sqlQuery.List();
- Assert.AreEqual(1, list.Count);
- object res = list[0];
- AssertClassAssignability(res.GetType(), typeof(IDictionary));
- IDictionary m = (IDictionary) res;
- Assert.AreEqual(2, m.Count);
- t.Commit();
- s.Close();
-
- s = OpenSession();
- t = s.BeginTransaction();
- sqlQuery = s.GetNamedQuery("organizationreturnproperty");
- sqlQuery.SetResultTransformer(CriteriaSpecification.AliasToEntityMap);
- list = sqlQuery.List();
- Assert.AreEqual(2, list.Count);
- m = (IDictionary) list[0];
- Assert.IsTrue(m.Contains("org"));
- AssertClassAssignability(m["org"].GetType(), typeof(Organization));
- Assert.IsTrue(m.Contains("emp"));
- AssertClassAssignability(m["emp"].GetType(), typeof(Employment));
- Assert.AreEqual(2, m.Count);
- t.Commit();
- s.Close();
-
- s = OpenSession();
- t = s.BeginTransaction();
- namedQuery = s.GetNamedQuery("EmploymentAndPerson");
- list = namedQuery.List();
- Assert.AreEqual(1, list.Count);
- object[] objs = (object[]) list[0];
- Assert.AreEqual(2, objs.Length);
- emp2 = (Employment) objs[0];
- gavin = (Person) objs[1];
- s.Delete(emp2);
- s.Delete(jboss);
- s.Delete(gavin);
- s.Delete(ifa);
- t.Commit();
- s.Close();
- }
-
- /* test for native sql composite id joins which has never been implemented */
-
- [Test, Ignore("Failure expected")]
- public void CompositeIdJoinsFailureExpected()
- {
- ISession s = OpenSession();
- ITransaction t = s.BeginTransaction();
- Person person = new Person();
- person.Name = "Noob";
-
- Product product = new Product();
- product.ProductId = new Product.ProductIdType();
- product.ProductId.Orgid = "x";
- product.ProductId.Productnumber = "1234";
- product.Name = "Hibernate 3";
-
- Order order = new Order();
- order.OrderId = new Order.OrderIdType();
- order.OrderId.Ordernumber = "1";
- order.OrderId.Orgid = "y";
-
- product.Orders.Add(order);
- order.Product = product;
- order.Person = person;
-
- s.Save(product);
- s.Save(order);
- s.Save(person);
-
- t.Commit();
- s.Close();
-
- s = OpenSession();
- t = s.BeginTransaction();
- Product p = (Product) s.CreateQuery("from Product p join fetch p.orders").List()[0];
- Assert.IsTrue(NHibernateUtil.IsInitialized(p.Orders));
- t.Commit();
- s.Close();
-
- s = OpenSession();
- t = s.BeginTransaction();
- object[] o = (object[]) s.CreateSQLQuery("select\r\n" +
- " product.orgid as {product.id.orgid}," +
- " product.productnumber as {product.id.productnumber}," +
- " {prod_orders}.orgid as orgid3_1_,\r\n" +
- " {prod_orders}.ordernumber as ordernum2_3_1_,\r\n" +
- " product.name as {product.name}," +
- " {prod_orders.element.*}," +
- /*" orders.PROD_NO as PROD4_3_1_,\r\n" +
- " orders.person as person3_1_,\r\n" +
- " orders.PROD_ORGID as PROD3_0__,\r\n" +
- " orders.PROD_NO as PROD4_0__,\r\n" +
- " orders.orgid as orgid0__,\r\n" +
- " orders.ordernumber as ordernum2_0__ \r\n" +*/
- " from\r\n" +
- " Product product \r\n" +
- " inner join\r\n" +
- " TBL_ORDER {prod_orders} \r\n" +
- " on product.orgid={prod_orders}.PROD_ORGID \r\n" +
- " and product.productnumber={prod_orders}.PROD_NO")
- .AddEntity("product", typeof(Product))
- .AddJoin("prod_orders", "product.orders")
- .List()[0];
-
- p = (Product) o[0];
- Assert.IsTrue(NHibernateUtil.IsInitialized(p.Orders));
- IEnumerator en = p.Orders.GetEnumerator();
- Assert.IsTrue(en.MoveNext());
- Assert.IsNotNull(en.Current);
- t.Commit();
- s.Close();
- }
-
- [Test]
- public void AutoDetectAliasing()
- {
- ISession s = OpenSession();
- ITransaction t = s.BeginTransaction();
- Organization ifa = new Organization("IFA");
- Organization jboss = new Organization("JBoss");
- Person gavin = new Person("Gavin");
- Employment emp = new Employment(gavin, jboss, "AU");
- s.Save(jboss);
- s.Save(ifa);
- s.Save(gavin);
- s.Save(emp);
- t.Commit();
- s.Close();
-
- s = OpenSession();
- t = s.BeginTransaction();
- IList list = s.CreateSQLQuery(EmploymentSQL)
- .AddEntity(typeof(Employment).FullName)
- .List();
- Assert.AreEqual(1, list.Count);
-
- Employment emp2 = (Employment) list[0];
- Assert.AreEqual(emp2.EmploymentId, emp.EmploymentId);
- Assert.AreEqual(emp2.StartDate.Date, emp.StartDate.Date);
- Assert.AreEqual(emp2.EndDate, emp.EndDate);
-
- s.Clear();
-
- list = s.CreateSQLQuery(EmploymentSQL)
- .AddEntity(typeof(Employment).FullName)
- .SetResultTransformer(CriteriaSpecification.AliasToEntityMap)
- .List();
- Assert.AreEqual(1, list.Count);
- IDictionary m = (IDictionary) list[0];
- Assert.IsTrue(m.Contains("Employment"));
- Assert.AreEqual(1, m.Count);
-
- list = s.CreateSQLQuery(EmploymentSQL).List();
- Assert.AreEqual(1, list.Count);
- object[] o = (object[]) list[0];
- Assert.AreEqual(8, o.Length);
-
- list = s.CreateSQLQuery(EmploymentSQL).SetResultTransformer(CriteriaSpecification.AliasToEntityMap).List();
- Assert.AreEqual(1, list.Count);
- m = (IDictionary) list[0];
- Assert.IsTrue(m.Contains("EMPID"));
- Assert.IsTrue(m.Contains("AVALUE"));
- Assert.IsTrue(m.Contains("ENDDATE"));
- Assert.AreEqual(8, m.Count);
-
- // TODO H3: H3.2 can guess the return column type so they can use just addScalar("employerid"),
- // but NHibernate currently can't do it.
- list =
- s.CreateSQLQuery(EmploymentSQLMixedScalarEntity).AddScalar("employerid", NHibernateUtil.Int64).AddEntity(
- typeof(Employment)).List();
- Assert.AreEqual(1, list.Count);
- o = (object[]) list[0];
- Assert.AreEqual(2, o.Length);
- AssertClassAssignability(o[0].GetType(), typeof(long));
- AssertClassAssignability(o[1].GetType(), typeof(Employment));
-
-
- IQuery queryWithCollection = s.GetNamedQuery("organizationEmploymentsExplicitAliases");
- queryWithCollection.SetInt64("id", jboss.Id);
- list = queryWithCollection.List();
- Assert.AreEqual(list.Count, 1);
-
- s.Clear();
-
- list = s.CreateSQLQuery(OrganizationJoinEmploymentSQL)
- .AddEntity("org", typeof(Organization))
- .AddJoin("emp", "org.employments")
- .List();
- Assert.AreEqual(2, list.Count);
-
- s.Clear();
-
- list = s.CreateSQLQuery(OrganizationFetchJoinEmploymentSQL)
- .AddEntity("org", typeof(Organization))
- .AddJoin("emp", "org.employments")
- .List();
- Assert.AreEqual(2, list.Count);
-
- s.Clear();
-
- // TODO : why twice?
- s.GetNamedQuery("organizationreturnproperty").List();
- list = s.GetNamedQuery("organizationreturnproperty").List();
- Assert.AreEqual(2, list.Count);
-
- s.Clear();
-
- list = s.GetNamedQuery("organizationautodetect").List();
- Assert.AreEqual(2, list.Count);
-
- t.Commit();
- s.Close();
-
- s = OpenSession();
- t = s.BeginTransaction();
- s.Delete(emp2);
-
- s.Delete(jboss);
- s.Delete(gavin);
- s.Delete(ifa);
- t.Commit();
- s.Close();
-
- s = OpenSession();
- t = s.BeginTransaction();
- Dimension dim = new Dimension(3, int.MaxValue);
- s.Save(dim);
- // s.Flush();
- s.CreateSQLQuery("select d_len * d_width as surface, d_len * d_width * 10 as volume from Dimension").List();
- s.Delete(dim);
- t.Commit();
- s.Close();
-
- s = OpenSession();
- t = s.BeginTransaction();
- SpaceShip enterprise = new SpaceShip();
- enterprise.Model = "USS";
- enterprise.Name = "Entreprise";
- enterprise.Speed = 50d;
- Dimension d = new Dimension(45, 10);
- enterprise.Dimensions = d;
- s.Save(enterprise);
- // s.Flush();
- object[] result = (object[]) s.GetNamedQuery("spaceship").UniqueResult();
- enterprise = (SpaceShip) result[0];
- Assert.IsTrue(50d == enterprise.Speed);
- Assert.IsTrue(450d == ExtractDoubleValue(result[1]));
- Assert.IsTrue(4500d == ExtractDoubleValue(result[2]));
- s.Delete(enterprise);
- t.Commit();
- s.Close();
- }
-
- [Test]
- public void MixAndMatchEntityScalar()
- {
- ISession s = OpenSession();
- ITransaction t = s.BeginTransaction();
- Speech speech = new Speech();
- speech.Length = 23d;
- speech.Name = "Mine";
- s.Save(speech);
- s.Flush();
- s.Clear();
-
- IList l = s.CreateSQLQuery("select name, id, flength, name as scalarName from Speech")
- .SetResultSetMapping("speech")
- .List();
- Assert.AreEqual(l.Count, 1);
-
- t.Rollback();
- s.Close();
- }
-
- [Test]
- public void ParameterList()
- {
- using (ISession s = OpenSession())
- {
- IList l = s.CreateSQLQuery("select id from Speech where id in (:idList)")
- .AddScalar("id", NHibernateUtil.Int32)
- .SetParameterList("idList", new int[] {0, 1, 2, 3}, NHibernateUtil.Int32)
- .List();
- }
- }
-
- private double ExtractDoubleValue(object value)
- {
- if (value is double)
- {
- return (double) value;
- }
- else if (value is decimal)
- {
- return (double) (decimal) value;
- }
- else
- {
- return double.Parse(value.ToString());
- }
- }
-
- public static void AssertClassAssignability(System.Type source, System.Type target)
- {
- Assert.IsTrue(target.IsAssignableFrom(source),
- "Classes were not assignment-compatible : source<" +
- source.FullName +
- "> target<" +
- target.FullName + ">"
- );
- }
- }
-}
Deleted: trunk/nhibernate/src/NHibernate.Test/SqlTest/Item.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/SqlTest/Item.cs 2009-02-07 22:32:27 UTC (rev 4070)
+++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Item.cs 2009-02-08 12:46:06 UTC (rev 4071)
@@ -1,41 +0,0 @@
-using System;
-using Iesi.Collections;
-
-namespace NHibernate.Test.SqlTest
-{
- public class Item
- {
- private int id;
- private int alternativeItemId;
-
- private ISet alternativeItems;
-
- protected Item()
- {
- }
-
- public Item(int id, int alternativeItemId)
- {
- this.id = id;
- this.alternativeItemId = alternativeItemId;
- }
-
- public virtual int Id
- {
- get { return id; }
- set { id = value; }
- }
-
- public virtual int AlternativeItemId
- {
- get { return alternativeItemId; }
- set { alternativeItemId = value; }
- }
-
- public virtual ISet AlternativeItems
- {
- get { return alternativeItems; }
- set { alternativeItems = value; }
- }
- }
-}
\ No newline at end of file
Deleted: trunk/nhibernate/src/NHibernate.Test/SqlTest/Item.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/SqlTest/Item.hbm.xml 2009-02-07 22:32:27 UTC (rev 4070)
+++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Item.hbm.xml 2009-02-08 12:46:06 UTC (rev 4071)
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
- assembly="NHibernate.Test"
- namespace="NHibernate.Test.SqlTest">
-
- <class name="Item">
- <id name="Id" column="id">
- <generator class="assigned" />
- </id>
-
- <property name="AlternativeItemId" update="false" />
- <set name="AlternativeItems">
- <key />
- <one-to-many class="Item" />
- <loader query-ref="getAlternativeItems" />
- <sql-delete>UPDATE Item SET Id = Id WHERE Id = ?</sql-delete>
- <sql-delete-all>UPDATE Item SET Id = Id WHERE Id = ?</sql-delete-all>
- </set>
- </class>
-
- <sql-query name="getAlternativeItems">
- <load-collection alias="ai" role="Item.AlternativeItems">
- <return-property name="key" column="collectionKey" />
- <return-property name="element" column="Id" />
- <return-property name="element.id" column="Id" />
- <return-property name="element.AlternativeItemId" column="AlternativeItemId" />
- </load-collection>
- <!-- Suppose alternate items for every item are all items except the item itself. -->
- SELECT CAST(:id AS INTEGER) as collectionKey, Item.* FROM Item WHERE Item.Id != :id
- </sql-query>
-
-</hibernate-mapping>
\ No newline at end of file
Copied: trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/Item.cs (from rev 4070, trunk/nhibernate/src/NHibernate.Test/SqlTest/Item.cs)
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/Item.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/Item.cs 2009-02-08 12:46:06 UTC (rev 4071)
@@ -0,0 +1,40 @@
+using Iesi.Collections;
+
+namespace NHibernate.Test.SqlTest.Query
+{
+ public class Item
+ {
+ private int id;
+ private int alternativeItemId;
+
+ private ISet alternativeItems;
+
+ protected Item()
+ {
+ }
+
+ public Item(int id, int alternativeItemId)
+ {
+ this.id = id;
+ this.alternativeItemId = alternativeItemId;
+ }
+
+ public virtual int Id
+ {
+ get { return id; }
+ set { id = value; }
+ }
+
+ public virtual int AlternativeItemId
+ {
+ get { return alternativeItemId; }
+ set { alternativeItemId = value; }
+ }
+
+ public virtual ISet AlternativeItems
+ {
+ get { return alternativeItems; }
+ set { alternativeItems = value; }
+ }
+ }
+}
\ No newline at end of file
Property changes on: trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/Item.cs
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/Item.hbm.xml (from rev 4070, trunk/nhibernate/src/NHibernate.Test/SqlTest/Item.hbm.xml)
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/Item.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/Item.hbm.xml 2009-02-08 12:46:06 UTC (rev 4071)
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
+ assembly="NHibernate.Test"
+ namespace="NHibernate.Test.SqlTest.Query">
+
+ <class name="Item">
+ <id name="Id" column="id">
+ <generator class="assigned" />
+ </id>
+
+ <property name="AlternativeItemId" update="false" />
+ <set name="AlternativeItems">
+ <key />
+ <one-to-many class="Item" />
+ <loader query-ref="getAlternativeItems" />
+ <sql-delete>UPDATE Item SET Id = Id WHERE Id = ?</sql-delete>
+ <sql-delete-all>UPDATE Item SET Id = Id WHERE Id = ?</sql-delete-all>
+ </set>
+ </class>
+
+ <sql-query name="getAlternativeItems">
+ <load-collection alias="ai" role="Item.AlternativeItems">
+ <return-property name="key" column="collectionKey" />
+ <return-property name="element" column="Id" />
+ <return-property name="element.id" column="Id" />
+ <return-property name="element.AlternativeItemId" column="AlternativeItemId" />
+ </load-collection>
+ <!-- Suppose alternate items for every item are all items except the item itself. -->
+ SELECT CAST(:id AS INTEGER) as collectionKey, Item.* FROM Item WHERE Item.Id != :id
+ </sql-query>
+
+</hibernate-mapping>
\ No newline at end of file
Property changes on: trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/Item.hbm.xml
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/NativeSQLQueries.hbm.xml (from rev 4070, trunk/nhibernate/src/NHibernate.Test/SqlTest/General.hbm.xml)
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/NativeSQLQueries.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/NativeSQLQueries.hbm.xml 2009-02-08 12:46:06 UTC (rev 4071)
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+
+ This mapping demonstrates the use of Hibernate with
+ all-handwritten SQL!
+-->
+
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="field.camelcase"
+ namespace="NHibernate.Test.SqlTest"
+ assembly="NHibernate.Test">
+
+ <class name="Organization" table="ORGANIZATION">
+ <id name="id" unsaved-value="0" column="ORGID">
+ <generator class="increment"/>
+ </id>
+ <property name="name" column="NAME" not-null="true"/>
+ <set lazy="true" name="employments"
+ inverse="true">
+ <key column="EMPLOYER"/>
+ <!-- only needed for DDL generation -->
+ <one-to-many class="Employment"/>
+ </set>
+ </class>
+
+ <class name="Person" table="PERSON">
+ <id name="id" unsaved-value="0" column="PERID">
+ <generator class="increment"/>
+ </id>
+ <property name="name" column="NAME" not-null="true"/>
+
+ </class>
+
+ <class name="Employment" table="EMPLOYMENT">
+ <id name="employmentId" unsaved-value="0" column="EMPID">
+ <generator class="increment"/>
+ </id>
+ <many-to-one name="employee" column="EMPLOYEE" not-null="true" update="false"/>
+ <many-to-one name="employer" column="EMPLOYER" not-null="true" update="false"/>
+ <property name="startDate" column="STARTDATE" not-null="false" type="NHibernate.Test.SqlTest.NullDateUserType, NHibernate.Test" />
+ <property name="endDate" column="ENDDATE" insert="false" type="NHibernate.Test.SqlTest.NullDateUserType, NHibernate.Test" />
+ <property name="regionCode" column="REGIONCODE" update="false"/>
+ <property name="salary" type="NHibernate.Test.SqlTest.MonetaryAmountUserType, NHibernate.Test">
+ <column name="AVALUE" sql-type="float"/>
+ <column name="CURRENCY"/>
+ </property>
+ </class>
+
+ <class name="Order" table="TBL_ORDER">
+ <composite-id name="orderId" class="Order+OrderIdType">
+ <key-property name="orgid"/>
+ <key-property name="ordernumber"/>
+ </composite-id>
+
+ <many-to-one name="product">
+ <column name="PROD_ORGID"/>
+ <column name="PROD_NO"/>
+ </many-to-one>
+ <many-to-one name="person"/>
+ </class>
+
+ <class name="Product">
+ <composite-id name="productId" class="Product+ProductIdType">
+ <key-property name="orgid"/>
+ <key-property name="productnumber"/>
+ </composite-id>
+
+ <property name="name"/>
+
+ <set name="orders" inverse="true">
+ <key>
+ <column name="PROD_ORGID"/>
+ <column name="PROD_NO"/>
+ </key>
+ <one-to-many class="Order"/>
+ </set>
+ </class>
+
+ <class name="Dimension">
+ <id name="id" type="long">
+ <generator class="increment"/>
+ </id>
+ <property name="length" column="d_len"/>
+ <property name="width" column="d_width"/>
+ </class>
+
+ <class name="SpaceShip">
+ <id name="id" type="integer">
+ <generator class="increment"/>
+ </id>
+ <property name="name" column="fld_name"/>
+ <property name="model" column="fld_model"/>
+ <property name="speed" column="fld_speed"/>
+ <component name="dimensions">
+ <property name="length" column="fld_length"/>
+ <property name="width" column="fld_width"/>
+ </component>
+ </class>
+
+ <class name="Speech">
+ <id name="id" type="integer">
+ <generator class="increment"/>
+ </id>
+ <property name="name" column="name"/>
+ <property name="length" column="flength"/>
+ </class>
+
+ <resultset name="org-emp-regionCode">
+ <return-scalar column="regionCode" type="string"/>
+ <return alias="org" class="Organization"/>
+ <return-join alias="emp" property="org.employments"/>
+ </resultset>
+
+ <resultset name="org-emp-person">
+ <return alias="org" class="Organization"/>
+ <return-join alias="emp" property="org.employments"/>
+ <return-join alias="pers" property="emp.employee"/>
+ </resultset>
+
+
+ <resultset name="org-description">
+ <return alias="org" class="Organization"/>
+ <return-join alias="emp" property="org.employments"/>
+ </resultset>
+
+ <resultset name="spaceship-vol">
+ <return alias="sps" class="SpaceShip">
+ <return-property name="id" column="id"/>
+ <return-property name="name" column="name"/>
+ <return-property name="model" column="model"/>
+ <return-property name="speed" column="speed"/>
+ <return-property name="dimensions.length" column="length"/>
+ <return-property name="dimensions.width" column="width"/>
+ </return>
+ <return-scalar column="surface" type="double" />
+ <return-scalar column="volume" type="double" />
+ </resultset>
+
+ <resultset name="speech">
+ <return alias="sp" class="Speech">
+ <return-property name="id" column="id"/>
+ <return-property name="name" column="name"/>
+ <return-property name="length" column="flength"/>
+ </return>
+ <return-scalar column="scalarName" type="string" />
+ </resultset>
+
+ <sql-query name="spaceship" resultset-ref="spaceship-vol">
+ select id as id,
+ fld_name as name,
+ fld_model as model,
+ fld_speed as speed,
+ fld_length as flength,
+ fld_width as width,
+ fld_length * fld_width as surface,
+ fld_length * fld_width *10 as volume
+ from SpaceShip
+ </sql-query>
+
+ <sql-query name="orgNamesOnly">
+ <return-scalar column="NAME" type="string"/>
+ SELECT org.NAME FROM ORGANIZATION org
+ </sql-query>
+
+ <sql-query name="orgNamesAndOrgs">
+ <return-scalar column="thename" type="string"/>
+ <return alias="org" class="Organization"/>
+ SELECT org.NAME AS thename, org.NAME AS {org.name}, org.ORGID AS {org.id}
+ FROM ORGANIZATION org
+ ORDER BY thename
+ </sql-query>
+
+ <sql-query name="orgsAndOrgNames">
+ <return alias="org" class="Organization"/>
+ <return-scalar column="thename" type="string"/>
+ SELECT org.NAME AS thename, org.NAME AS {org.name}, org.ORGID AS {org.id}
+ FROM ORGANIZATION org
+ ORDER BY thename
+ </sql-query>
+
+ <sql-query name="orgIdsAndOrgNames">
+ <return-scalar column="orgid" type="long"/>
+ <return-scalar column="thename" type="string"/>
+ SELECT NAME AS thename, ORGID AS orgid
+ FROM ORGANIZATION
+ ORDER BY thename
+ </sql-query>
+
+ <sql-query name="AllEmploymentAsMapped">
+ <return class="Employment"/>
+ SELECT * FROM EMPLOYMENT
+ </sql-query>
+
+ <sql-query name="EmploymentAndPerson">
+ <return class="Employment"/>
+ <return class="Person"/>
+ SELECT * FROM EMPLOYMENT, PERSON
+ </sql-query>
+
+ <sql-query name="organizationEmploymentsExplicitAliases">
+ <load-collection alias="empcol" role="Organization.employments"/>
+ SELECT empcol.EMPLOYER as {empcol.key}, empcol.EMPID as {empcol.element}, {empcol.element.*}
+ FROM EMPLOYMENT empcol
+ WHERE EMPLOYER = :id
+ ORDER BY STARTDATE ASC, EMPLOYEE ASC
+ </sql-query>
+
+ <sql-query name="organizationreturnproperty">
+ <return alias="org" class="Organization">
+ <return-property name="id" column="ORGID"/>
+ <return-property name="name" column="NAME"/>
+ </return>
+ <return-join alias="emp" property="org.employments">
+ <return-property name="key" column="EMPLOYER"/>
+ <return-property name="element" column="EMPID"/>
+ <return-property name="element.employee" column="EMPLOYEE"/>
+ <return-property name="element.employer" column="EMPLOYER"/>
+ <return-property name="element.startDate" column="XSTARTDATE"/>
+ <return-property name="element.endDate" column="ENDDATE"/>
+ <return-property name="element.regionCode" column="REGIONCODE"/>
+ <return-property name="element.employmentId" column="EMPID"/>
+ <return-property name="element.salary">
+ <return-column name="AVALUE"/>
+ <return-column name="CURRENCY"/>
+ </return-property>
+ </return-join>
+ SELECT org.ORGID as orgid,
+ org.NAME as name,
+ emp.EMPLOYER as employer,
+ emp.EMPID as empid,
+ emp.EMPLOYEE as employee,
+ emp.EMPLOYER as employer,
+ emp.STARTDATE as xstartDate,
+ emp.ENDDATE as endDate,
+ emp.REGIONCODE as regionCode,
+ emp.AVALUE as AVALUE,
+ emp.CURRENCY as CURRENCY
+ FROM ORGANIZATION org
+ LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER
+ </sql-query>
+
+
+ <sql-query name="organizationautodetect" resultset-ref="org-description">
+ <!-- equal to "organizationpropertyreturn" but since no {} nor return-property are used hibernate will fallback to use the columns directly from the mapping -->
+ <return alias="org" class="Organization"/>
+ <return-join alias="emp" property="org.employments"/>
+ SELECT org.ORGID as orgid,
+ org.NAME as name,
+ emp.EMPLOYER as employer,
+ emp.EMPID as empid,
+ emp.EMPLOYEE as employee,
+ emp.EMPLOYER as employer,
+ emp.STARTDATE as startDate,
+ emp.ENDDATE as endDate,
+ emp.REGIONCODE as regionCode,
+ emp.AVALUE as AVALUE,
+ emp.CURRENCY as CURRENCY
+ FROM ORGANIZATION org
+ LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER
+ </sql-query>
+
+</hibernate-mapping>
Property changes on: trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/NativeSQLQueries.hbm.xml
___________________________________________________________________
Added: svn:mergeinfo
+
Copied: trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/NativeSQLQueriesFixture.cs (from rev 4070, trunk/nhibernate/src/NHibernate.Test/SqlTest/GeneralTest.cs)
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/NativeSQLQueriesFixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Query/NativeSQLQueriesFixture.cs 2009-02-08 12:46:06 UTC (rev 4071)
@@ -0,0 +1,600 @@
+using System.Collections;
+using NHibernate.Transform;
+using NUnit.Framework;
+using NHibernate.Criterion;
+
+namespace NHibernate.Test.SqlTest.Query
+{
+ [TestFixture]
+ public class GeneralTest : TestCase
+ {
+ protected const string OrganizationFetchJoinEmploymentSQL =
+ "SELECT org.ORGID as {org.id}, " +
+ " org.NAME as {org.name}, " +
+ " emp.EMPLOYER as {emp.key}, " +
+ " emp.EMPID as {emp.element}, " +
+ " {emp.element.*} " +
+ "FROM ORGANIZATION org " +
+ " LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER";
+
+ protected const string OrganizationJoinEmploymentSQL =
+ "SELECT org.ORGID as {org.id}, " +
+ " org.NAME as {org.name}, " +
+ " {emp.*} " +
+ "FROM ORGANIZATION org " +
+ " LEFT OUTER JOIN EMPLOYMENT emp ON org.ORGID = emp.EMPLOYER";
+
+ protected const string EmploymentSQL = "SELECT * FROM EMPLOYMENT";
+
+ protected string EmploymentSQLMixedScalarEntity =
+ "SELECT e.*, e.employer as employerid FROM EMPLOYMENT e";
+
+ protected const string OrgEmpRegionSQL =
+ "select {org.*}, {emp.*}, emp.REGIONCODE " +
+ "from ORGANIZATION org " +
+ " left outer join EMPLOYMENT emp on org.ORGID = emp.EMPLOYER";
+
+ protected string OrgEmpPersonSQL =
+ "select {org.*}, {emp.*}, {pers.*} " +
+ "from ORGANIZATION org " +
+ " join EMPLOYMENT emp on org.ORGID = emp.EMPLOYER " +
+ " join PERSON pers on pers.PERID = emp.EMPLOYEE ";
+
+ protected override IList Mappings
+ {
+ get { return new[] { "SqlTest.Query.NativeSQLQueries.hbm.xml" }; }
+ }
+
+ protected override string MappingsAssembly
+ {
+ get { return "NHibernate.Test"; }
+ }
+
+ [Test]
+ public void FailOnNoAddEntityOrScalar()
+ {
+ // Note: this passes, but for the wrong reason.
+ // there is actually an exception thrown, but it is the database
+ // throwing a sql exception because the SQL gets passed
+ // "un-processed"...
+ ISession s = OpenSession();
+ try
+ {
+ string sql = "select {org.*} " +
+ "from organization org";
+ s.CreateSQLQuery(sql).List();
+ Assert.Fail("Should throw an exception since no AddEntity nor AddScalar has been performed.");
+ }
+ catch (HibernateException)
+ {
+ // expected behavior
+ }
+ finally
+ {
+ s.Close();
+ }
+ }
+
+ [Test]
+ public void SQLQueryInterface()
+ {
+ ISession s = OpenSession();
+ ITransaction t = s.BeginTransaction();
+ Organization ifa = new Organization("IFA");
+ Organization jboss = new Organization("JBoss");
+ Person gavin = new Person("Gavin");
+ Employment emp = new Employment(gavin, jboss, "AU");
+
+ s.Save(ifa);
+ s.Save(jboss);
+ s.Save(gavin);
+ s.Save(emp);
+
+ IList l = s.CreateSQLQuery(OrgEmpRegionSQL)
+ .AddEntity("org", typeof(Organization))
+ .AddJoin("emp", "org.employments")
+ .AddScalar("regionCode", NHibernateUtil.String)
+ .List();
+ Assert.AreEqual(2, l.Count);
+
+ l = s.CreateSQLQuery(OrgEmpPersonSQL)
+ .AddEntity("org", typeof(Organization))
+ .AddJoin("emp", "org.employments")
+ .AddJoin("pers", "emp.employee")
+ .List();
+ Assert.AreEqual(l.Count, 1);
+
+ t.Commit();
+ s.Close();
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+
+ l = s.CreateSQLQuery("select {org.*}, {emp.*} " +
+ "from ORGANIZATION org " +
+ " left outer join EMPLOYMENT emp on org.ORGID = emp.EMPLOYER, ORGANIZATION org2")
+ .AddEntity("org", typeof(Organization))
+ .AddJoin("emp", "org.employments")
+ .SetResultTransformer(new DistinctRootEntityResultTransformer())
+ .List();
+ Assert.AreEqual(l.Count, 2);
+
+ t.Commit();
+ s.Close();
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+
+ s.Delete(emp);
+ s.Delete(gavin);
+ s.Delete(ifa);
+ s.Delete(jboss);
+
+ t.Commit();
+ s.Close();
+ }
+
+ [Test]
+ public void ResultSetMappingDefinition()
+ {
+ ISession s = OpenSession();
+ ITransaction t = s.BeginTransaction();
+ Organization ifa = new Organization("IFA");
+ Organization jboss = new Organization("JBoss");
+ Person gavin = new Person("Gavin");
+ Employment emp = new Employment(gavin, jboss, "AU");
+
+ s.Save(ifa);
+ s.Save(jboss);
+ s.Save(gavin);
+ s.Save(emp);
+
+ IList l = s.CreateSQLQuery(OrgEmpRegionSQL)
+ .SetResultSetMapping("org-emp-regionCode")
+ .List();
+ Assert.AreEqual(l.Count, 2);
+
+ l = s.CreateSQLQuery(OrgEmpPersonSQL)
+ .SetResultSetMapping("org-emp-person")
+ .List();
+ Assert.AreEqual(l.Count, 1);
+
+ s.Delete(emp);
+ s.Delete(gavin);
+ s.Delete(ifa);
+ s.Delete(jboss);
+
+ t.Commit();
+ s.Close();
+ }
+
+ [Test]
+ public void ScalarValues()
+ {
+ ISession s = OpenSession();
+ ITransaction t = s.BeginTransaction();
+
+ Organization ifa = new Organization("IFA");
+ Organization jboss = new Organization("JBoss");
+
+ object idIfa = s.Save(ifa);
+ object idJBoss = s.Save(jboss);
+
+ s.Flush();
+
+ IList result = s.GetNamedQuery("orgNamesOnly").List();
+ Assert.IsTrue(result.Contains("IFA"));
+ Assert.IsTrue(result.Contains("JBoss"));
+
+ result = s.GetNamedQuery("orgNamesOnly").SetResultTransformer(CriteriaSpecification.AliasToEntityMap).List();
+ IDictionary m = (IDictionary) result[0];
+ Assert.AreEqual(2, result.Count);
+ Assert.AreEqual(1, m.Count);
+ Assert.IsTrue(m.Contains("NAME"));
+
+ t.Commit();
+ s.Close();
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+
+ IEnumerator iter = s.GetNamedQuery("orgNamesAndOrgs").List().GetEnumerator();
+ iter.MoveNext();
+ object[] o = (object[]) iter.Current;
+ Assert.AreEqual(o[0], "IFA");
+ Assert.AreEqual(((Organization) o[1]).Name, "IFA");
+ iter.MoveNext();
+ o = (object[]) iter.Current;
+ Assert.AreEqual(o[0], "JBoss");
+ Assert.AreEqual(((Organization) o[1]).Name, "JBoss");
+
+ t.Commit();
+ s.Close();
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+
+ // test that the ordering of the results is truly based on the order in which they were defined
+ iter = s.GetNamedQuery("orgsAndOrgNames").List().GetEnumerator();
+ iter.MoveNext();
+ object[] row = (object[]) iter.Current;
+ Assert.AreEqual(typeof(Organization), row[0].GetType(), "expecting non-scalar result first");
+ Assert.AreEqual(typeof(string), row[1].GetType(), "expecting scalar result second");
+ Assert.AreEqual("IFA", ((Organization) row[0]).Name);
+ Assert.AreEqual(row[1], "IFA");
+ iter.MoveNext();
+ row = (object[]) iter.Current;
+ Assert.AreEqual(typeof(Organization), row[0].GetType(), "expecting non-scalar result first");
+ Assert.AreEqual(typeof(string), row[1].GetType(), "expecting scalar result second");
+ Assert.AreEqual(((Organization) row[0]).Name, "JBoss");
+ Assert.AreEqual(row[1], "JBoss");
+ Assert.IsFalse(iter.MoveNext());
+
+ t.Commit();
+ s.Close();
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+
+ iter = s.GetNamedQuery("orgIdsAndOrgNames").List().GetEnumerator();
+ iter.MoveNext();
+ o = (object[]) iter.Current;
+ Assert.AreEqual(o[1], "IFA");
+ Assert.AreEqual(o[0], idIfa);
+ iter.MoveNext();
+ o = (object[]) iter.Current;
+ Assert.AreEqual(o[1], "JBoss");
+ Assert.AreEqual(o[0], idJBoss);
+
+ s.Delete(ifa);
+ s.Delete(jboss);
+ t.Commit();
+ s.Close();
+ }
+
+ [Test]
+ public void MappedAliasStrategy()
+ {
+ ISession s = OpenSession();
+ ITransaction t = s.BeginTransaction();
+ Organization ifa = new Organization("IFA");
+ Organization jboss = new Organization("JBoss");
+ Person gavin = new Person("Gavin");
+ Employment emp = new Employment(gavin, jboss, "AU");
+ s.Save(jboss);
+ s.Save(ifa);
+ s.Save(gavin);
+ s.Save(emp);
+ t.Commit();
+ s.Close();
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+ IQuery namedQuery = s.GetNamedQuery("AllEmploymentAsMapped");
+ IList list = namedQuery.List();
+ Assert.AreEqual(1, list.Count);
+ Employment emp2 = (Employment) list[0];
+ Assert.AreEqual(emp2.EmploymentId, emp.EmploymentId);
+ Assert.AreEqual(emp2.StartDate.Date, emp.StartDate.Date);
+ Assert.AreEqual(emp2.EndDate, emp.EndDate);
+ t.Commit();
+ s.Close();
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+ IQuery sqlQuery = s.GetNamedQuery("EmploymentAndPerson");
+ sqlQuery.SetResultTransformer(CriteriaSpecification.AliasToEntityMap);
+ list = sqlQuery.List();
+ Assert.AreEqual(1, list.Count);
+ object res = list[0];
+ AssertClassAssignability(res.GetType(), typeof(IDictionary));
+ IDictionary m = (IDictionary) res;
+ Assert.AreEqual(2, m.Count);
+ t.Commit();
+ s.Close();
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+ sqlQuery = s.GetNamedQuery("organizationreturnproperty");
+ sqlQuery.SetResultTransformer(CriteriaSpecification.AliasToEntityMap);
+ list = sqlQuery.List();
+ Assert.AreEqual(2, list.Count);
+ m = (IDictionary) list[0];
+ Assert.IsTrue(m.Contains("org"));
+ AssertClassAssignability(m["org"].GetType(), typeof(Organization));
+ Assert.IsTrue(m.Contains("emp"));
+ AssertClassAssignability(m["emp"].GetType(), typeof(Employment));
+ Assert.AreEqual(2, m.Count);
+ t.Commit();
+ s.Close();
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+ namedQuery = s.GetNamedQuery("EmploymentAndPerson");
+ list = namedQuery.List();
+ Assert.AreEqual(1, list.Count);
+ object[] objs = (object[]) list[0];
+ Assert.AreEqual(2, objs.Length);
+ emp2 = (Employment) objs[0];
+ gavin = (Person) objs[1];
+ s.Delete(emp2);
+ s.Delete(jboss);
+ s.Delete(gavin);
+ s.Delete(ifa);
+ t.Commit();
+ s.Close();
+ }
+
+ /* test for native sql composite id joins which has never been implemented */
+
+ [Test, Ignore("Failure expected")]
+ public void CompositeIdJoinsFailureExpected()
+ {
+ ISession s = OpenSession();
+ ITransaction t = s.BeginTransaction();
+ Person person = new Person();
+ person.Name = "Noob";
+
+ Product product = new Product();
+ product.ProductId = new Product.ProductIdType();
+ product.ProductId.Orgid = "x";
+ product.ProductId.Productnumber = "1234";
+ product.Name = "Hibernate 3";
+
+ Order order = new Order();
+ order.OrderId = new Order.OrderIdType();
+ order.OrderId.Ordernumber = "1";
+ order.OrderId.Orgid = "y";
+
+ product.Orders.Add(order);
+ order.Product = product;
+ order.Person = person;
+
+ s.Save(product);
+ s.Save(order);
+ s.Save(person);
+
+ t.Commit();
+ s.Close();
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+ Product p = (Product) s.CreateQuery("from Product p join fetch p.orders").List()[0];
+ Assert.IsTrue(NHibernateUtil.IsInitialized(p.Orders));
+ t.Commit();
+ s.Close();
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+ object[] o = (object[]) s.CreateSQLQuery("select\r\n" +
+ " product.orgid as {product.id.orgid}," +
+ " product.productnumber as {product.id.productnumber}," +
+ " {prod_orders}.orgid as orgid3_1_,\r\n" +
+ " {prod_orders}.ordernumber as ordernum2_3_1_,\r\n" +
+ " product.name as {product.name}," +
+ " {prod_orders.element.*}," +
+ /*" orders.PROD_NO as PROD4_3_1_,\r\n" +
+ " orders.person as person3_1_,\r\n" +
+ " orders.PROD_ORGID as PROD3_0__,\r\n" +
+ " orders.PROD_NO as PROD4_0__,\r\n" +
+ " orders.orgid as orgid0__,\r\n" +
+ " orders.ordernumber as ordernum2_0__ \r\n" +*/
+ " from\r\n" +
+ " Product product \r\n" +
+ " inner join\r\n" +
+ " TBL_ORDER {prod_orders} \r\n" +
+ " on product.orgid={prod_orders}.PROD_ORGID \r\n" +
+ " and product.productnumber={prod_orders}.PROD_NO")
+ .AddEntity("product", typeof(Product))
+ .AddJoin("prod_orders", "product.orders")
+ .List()[0];
+
+ p = (Product) o[0];
+ Assert.IsTrue(NHibernateUtil.IsInitialized(p.Orders));
+ IEnumerator en = p.Orders.GetEnumerator();
+ Assert.IsTrue(en.MoveNext());
+ Assert.IsNotNull(en.Current);
+ t.Commit();
+ s.Close();
+ }
+
+ [Test]
+ public void AutoDetectAliasing()
+ {
+ ISession s = OpenSession();
+ ITransaction t = s.BeginTransaction();
+ Organization ifa = new Organization("IFA");
+ Organization jboss = new Organization("JBoss");
+ Person gavin = new Person("Gavin");
+ Employment emp = new Employment(gavin, jboss, "AU");
+ s.Save(jboss);
+ s.Save(ifa);
+ s.Save(gav...
[truncated message content] |