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] |