|
From: <jul...@us...> - 2010-09-26 03:53:34
|
Revision: 5222
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5222&view=rev
Author: julian-maughan
Date: 2010-09-26 03:53:27 +0000 (Sun, 26 Sep 2010)
Log Message:
-----------
Fixed "QueryException thrown when grouping by component". Port of HHH-5082 (r19183).
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Criterion/ICriteriaQuery.cs
trunk/nhibernate/src/NHibernate/Criterion/PropertyProjection.cs
trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs
trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs
Modified: trunk/nhibernate/src/NHibernate/Criterion/ICriteriaQuery.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/ICriteriaQuery.cs 2010-09-26 03:00:13 UTC (rev 5221)
+++ trunk/nhibernate/src/NHibernate/Criterion/ICriteriaQuery.cs 2010-09-26 03:53:27 UTC (rev 5222)
@@ -13,8 +13,11 @@
{
ISessionFactoryImplementor Factory { get; }
- /// <summary> Get the names of the columns mapped by a property path, ignoring projection aliases </summary>
+ /// <summary> Get the name of the column mapped by a property path, ignoring projection alias</summary>
string GetColumn(ICriteria criteria, string propertyPath);
+
+ /// <summary> Get the names of the columns mapped by a property path, ignoring projection aliases</summary>
+ string[] GetColumns(ICriteria criteria, string propertyPath);
/// <summary> Get the type of a property path, ignoring projection aliases</summary>
IType GetType(ICriteria criteria, string propertyPath);
@@ -75,4 +78,4 @@
/// </summary>
int? CreatePagingParameter(int value);
}
-}
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Criterion/PropertyProjection.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/PropertyProjection.cs 2010-09-26 03:00:13 UTC (rev 5221)
+++ trunk/nhibernate/src/NHibernate/Criterion/PropertyProjection.cs 2010-09-26 03:53:27 UTC (rev 5222)
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using NHibernate.SqlCommand;
using NHibernate.Type;
+using NHibernate.Util;
namespace NHibernate.Criterion
{
@@ -72,7 +73,7 @@
{
throw new InvalidOperationException("not a grouping projection");
}
- return new SqlString(criteriaQuery.GetColumn(criteria, propertyName));
+ return new SqlString(StringHelper.Join(",", criteriaQuery.GetColumns(criteria, propertyName)));
}
}
}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs 2010-09-26 03:00:13 UTC (rev 5221)
+++ trunk/nhibernate/src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs 2010-09-26 03:53:27 UTC (rev 5222)
@@ -530,7 +530,7 @@
public string GetColumn(ICriteria criteria, string propertyName)
{
- string[] cols = GetColumns(propertyName, criteria);
+ string[] cols = GetColumns(criteria, propertyName);
if (cols.Length != 1)
{
throw new QueryException("property does not map to a single column: " + propertyName);
@@ -546,7 +546,7 @@
// NH Different behavior: we don't use the projection alias for NH-1023
try
{
- return GetColumns(propertyName, subcriteria);
+ return GetColumns(subcriteria, propertyName);
}
catch (HibernateException)
{
@@ -579,7 +579,7 @@
return new TypedValue(loadable.IdentifierType, value, EntityMode.Poco);
}
- private string[] GetColumns(string propertyName, ICriteria subcriteria)
+ public string[] GetColumns(ICriteria subcriteria, string propertyName)
{
string entName = GetEntityName(subcriteria, propertyName);
if (entName == null)
@@ -795,7 +795,7 @@
//look for a property
try
{
- return GetColumns(propertyName, subcriteria);
+ return GetColumns(subcriteria, propertyName);
}
catch (HibernateException)
{
Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2010-09-26 03:00:13 UTC (rev 5221)
+++ trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2010-09-26 03:53:27 UTC (rev 5222)
@@ -239,9 +239,170 @@
}
[Test]
- [Ignore("To be implemented")]
public void SubselectWithComponent()
{
+ Course course = null;
+ Student gavin = null;
+ DetachedCriteria dc = null;
+ CityState odessaWa = null;
+ Enrolment enrolment2 = null;
+
+ using (ISession session = OpenSession())
+ using (ITransaction t = session.BeginTransaction())
+ {
+ course = new Course();
+ course.CourseCode = "HIB";
+ course.Description = "Hibernate Training";
+ session.Save(course);
+
+ odessaWa = new CityState("Odessa", "WA");
+
+ gavin = new Student();
+ gavin.Name = "Gavin King";
+ gavin.StudentNumber = 232;
+ gavin.CityState = odessaWa;
+ session.Save(gavin);
+
+ enrolment2 = new Enrolment();
+ enrolment2.Course = course;
+ enrolment2.CourseCode = course.CourseCode;
+ enrolment2.Semester = 3;
+ enrolment2.Year = 1998;
+ enrolment2.Student = gavin;
+ enrolment2.StudentNumber = gavin.StudentNumber;
+ gavin.Enrolments.Add(enrolment2);
+
+ session.Persist(enrolment2);
+
+ dc = DetachedCriteria.For<Student>()
+ .Add(Property.ForName("CityState").Eq(odessaWa))
+ .SetProjection(Property.ForName("CityState"));
+
+ session.CreateCriteria<Student>()
+ .Add(Subqueries.Exists(dc))
+ .List();
+
+ t.Commit();
+ }
+
+ using (ISession session = OpenSession())
+ using (ITransaction t = session.BeginTransaction())
+ {
+ try
+ {
+ session.CreateCriteria<Student>()
+ .Add(Subqueries.PropertyEqAll("CityState", dc))
+ .List();
+
+ Assert.Fail("should have failed because cannot compare subquery results with multiple columns");
+ }
+ catch (QueryException ex)
+ {
+ // expected
+ }
+ t.Rollback();
+ }
+
+ using (ISession session = OpenSession())
+ using (ITransaction t = session.BeginTransaction())
+ {
+ try
+ {
+ session.CreateCriteria<Student>()
+ .Add(Property.ForName("CityState").EqAll(dc))
+ .List();
+
+ Assert.Fail("should have failed because cannot compare subquery results with multiple columns");
+ }
+ catch (QueryException ex)
+ {
+ // expected
+ }
+ finally
+ {
+ t.Rollback();
+ }
+ }
+
+ using (ISession session = OpenSession())
+ using (ITransaction t = session.BeginTransaction())
+ {
+ try
+ {
+ session.CreateCriteria<Student>()
+ .Add(Subqueries.In(odessaWa, dc))
+ .List();
+
+ Assert.Fail("should have failed because cannot compare subquery results with multiple columns");
+ }
+ catch (NHibernate.Exceptions.GenericADOException ex)
+ {
+ // expected
+ }
+ finally
+ {
+ t.Rollback();
+ }
+ }
+
+ using (ISession session = OpenSession())
+ using (ITransaction t = session.BeginTransaction())
+ {
+ DetachedCriteria dc2 = DetachedCriteria.For<Student>("st1")
+ .Add(Property.ForName("st1.CityState").EqProperty("st2.CityState"))
+ .SetProjection(Property.ForName("CityState"));
+
+ try
+ {
+ session.CreateCriteria<Student>("st2")
+ .Add( Subqueries.Eq(odessaWa, dc2))
+ .List();
+ Assert.Fail("should have failed because cannot compare subquery results with multiple columns");
+ }
+ catch (NHibernate.Exceptions.GenericADOException ex)
+ {
+ // expected
+ }
+ finally
+ {
+ t.Rollback();
+ }
+ }
+
+ using (ISession session = OpenSession())
+ using (ITransaction t = session.BeginTransaction())
+ {
+ DetachedCriteria dc3 = DetachedCriteria.For<Student>("st")
+ .CreateCriteria("Enrolments")
+ .CreateCriteria("Course")
+ .Add(Property.ForName("Description").Eq("Hibernate Training"))
+ .SetProjection(Property.ForName("st.CityState"));
+ try
+ {
+ session.CreateCriteria<Enrolment>("e")
+ .Add(Subqueries.Eq(odessaWa, dc3))
+ .List();
+
+ Assert.Fail("should have failed because cannot compare subquery results with multiple columns");
+ }
+ catch (NHibernate.Exceptions.GenericADOException ex)
+ {
+ // expected
+ }
+ finally
+ {
+ t.Rollback();
+ }
+ }
+
+ using (ISession session = OpenSession())
+ using (ITransaction t = session.BeginTransaction())
+ {
+ session.Delete(enrolment2);
+ session.Delete(gavin);
+ session.Delete(course);
+ t.Commit();
+ }
}
[Test]
@@ -1090,11 +1251,15 @@
Course course = new Course();
course.CourseCode = "HIB";
course.Description = "Hibernate Training";
+ course.CourseMeetings.Add(new CourseMeeting(course, "Monday", 1, "1313 Mockingbird Lane"));
s.Save(course);
Student gavin = new Student();
gavin.Name = "Gavin King";
gavin.StudentNumber = 667;
+ CityState odessaWa = new CityState("Odessa", "WA");
+ gavin.CityState = odessaWa;
+ gavin.PreferredCourse = course;
s.Save(gavin);
Student xam = new Student();
@@ -1123,11 +1288,92 @@
s.Save(enrolment);
s.Flush();
+ // Subtest #1
+ IList resultList = s.CreateCriteria<Enrolment>()
+ .SetProjection(Projections.ProjectionList()
+ .Add(Property.ForName("Student"), "student")
+ .Add(Property.ForName("Course"), "course")
+ .Add(Property.ForName("Semester"), "semester")
+ .Add(Property.ForName("Year"), "year")
+ ).List();
+
+ Assert.That(resultList.Count, Is.EqualTo(2));
+
+ foreach (object[] objects in resultList)
+ {
+ Assert.That(objects.Length, Is.EqualTo(4));
+ Assert.That(objects[0], Is.InstanceOf<Student>());
+ Assert.That(objects[1], Is.InstanceOf<Course>());
+ Assert.That(objects[2], Is.InstanceOf<short>());
+ Assert.That(objects[3], Is.InstanceOf<short>());
+ }
+
+ // Subtest #2
+ resultList = s.CreateCriteria<Student>()
+ .SetProjection(Projections.ProjectionList()
+ .Add(Projections.Id().As("StudentNumber"))
+ .Add(Property.ForName("Name"), "name")
+ .Add(Property.ForName("CityState"), "cityState")
+ .Add(Property.ForName("PreferredCourse"), "preferredCourse")
+ ).List();
+
+ Assert.That(resultList.Count, Is.EqualTo(2));
+
+ foreach(object[] objects in resultList)
+ {
+ Assert.That(objects.Length, Is.EqualTo(4));
+ Assert.That(objects[0], Is.InstanceOf<long>());
+ Assert.That(objects[1], Is.InstanceOf<string>());
+
+ if ("Gavin King".Equals(objects[1]))
+ {
+ Assert.That(objects[2], Is.InstanceOf<CityState>());
+ Assert.That(objects[3], Is.InstanceOf<Course>());
+ }
+ else
+ {
+ Assert.That(objects[2], Is.Null);
+ Assert.That(objects[3], Is.Null);
+ }
+ }
+
+ // Subtest #3
+ resultList = s.CreateCriteria<Student>()
+ .Add(Restrictions.Eq("Name", "Gavin King"))
+ .SetProjection(Projections.ProjectionList()
+ .Add(Projections.Id().As("StudentNumber"))
+ .Add(Property.ForName("Name"), "name")
+ .Add(Property.ForName("CityState"), "cityState")
+ .Add(Property.ForName("PreferredCourse"), "preferredCourse")
+ ).List();
+
+ Assert.That(resultList.Count, Is.EqualTo(1));
+
+ // Subtest #4
+ object[] aResult = (object[])s.CreateCriteria<Student>()
+ .Add(Restrictions.IdEq(667L))
+ .SetProjection(Projections.ProjectionList()
+ .Add(Projections.Id().As("StudentNumber"))
+ .Add(Property.ForName("Name"), "name")
+ .Add(Property.ForName("CityState"), "cityState")
+ .Add(Property.ForName("PreferredCourse"), "preferredCourse")
+ ).UniqueResult();
+
+ Assert.That(aResult, Is.Not.Null);
+ Assert.That(aResult.Length, Is.EqualTo(4));
+ Assert.That(aResult[0], Is.InstanceOf<long>());
+ Assert.That(aResult[1], Is.InstanceOf<string>());
+ Assert.That(aResult[2], Is.InstanceOf<CityState>());
+ Assert.That(aResult[3], Is.InstanceOf<Course>());
+
+ // Subtest #5
int count = (int)s.CreateCriteria(typeof(Enrolment))
.SetProjection(Property.ForName("StudentNumber").Count().SetDistinct())
.UniqueResult();
+
Assert.AreEqual(2, count);
+ // Subtest #6
object obj = s.CreateCriteria(typeof(Enrolment))
.SetProjection(Projections.ProjectionList()
.Add(Property.ForName("StudentNumber").Count())
@@ -1136,6 +1382,7 @@
.Add(Property.ForName("StudentNumber").Avg())
)
.UniqueResult();
+
object[] result = (object[])obj;
Assert.AreEqual(2, result[0]);
@@ -1143,7 +1390,7 @@
Assert.AreEqual(101L, result[2]);
Assert.AreEqual(384.0D, (double)result[3], 0.01D);
-
+ // Subtest #7
s.CreateCriteria(typeof(Enrolment))
.Add(Property.ForName("StudentNumber").Gt(665L))
.Add(Property.ForName("StudentNumber").Lt(668L))
@@ -1152,6 +1399,7 @@
.AddOrder(Property.ForName("StudentNumber").Asc())
.UniqueResult();
+ // Subtest #8
IList resultWithMaps = s.CreateCriteria(typeof(Enrolment))
.SetProjection(Projections.ProjectionList()
.Add(Property.ForName("StudentNumber").As("stNumber"))
@@ -1164,11 +1412,12 @@
.List();
Assert.AreEqual(1, resultWithMaps.Count);
+
IDictionary m1 = (IDictionary)resultWithMaps[0];
-
Assert.AreEqual(667L, m1["stNumber"]);
Assert.AreEqual(course.CourseCode, m1["cCode"]);
+ // Subtest #9
resultWithMaps = s.CreateCriteria(typeof(Enrolment))
.SetProjection(Property.ForName("StudentNumber").As("stNumber"))
.AddOrder(Order.Desc("stNumber"))
@@ -1176,19 +1425,19 @@
.List();
Assert.AreEqual(2, resultWithMaps.Count);
+
IDictionary m0 = (IDictionary)resultWithMaps[0];
m1 = (IDictionary)resultWithMaps[1];
-
Assert.AreEqual(101L, m1["stNumber"]);
Assert.AreEqual(667L, m0["stNumber"]);
-
+ // Subtest #10
IList resultWithAliasedBean = s.CreateCriteria(typeof(Enrolment))
.CreateAlias("Student", "st")
.CreateAlias("Course", "co")
.SetProjection(Projections.ProjectionList()
- .Add(Property.ForName("st.Name").As("studentName"))
- .Add(Property.ForName("co.Description").As("courseDescription"))
+ .Add(Property.ForName("st.Name").As("studentName"))
+ .Add(Property.ForName("co.Description").As("courseDescription"))
)
.AddOrder(Order.Desc("studentName"))
.SetResultTransformer(Transformers.AliasToBean(typeof(StudentDTO)))
@@ -1196,10 +1445,29 @@
Assert.AreEqual(2, resultWithAliasedBean.Count);
+ // Subtest #11
StudentDTO dto = (StudentDTO)resultWithAliasedBean[0];
Assert.IsNotNull(dto.Description);
Assert.IsNotNull(dto.Name);
+ // Subtest #12
+ CourseMeeting courseMeetingDto = s.CreateCriteria<CourseMeeting>()
+ .SetProjection(Projections.ProjectionList()
+ .Add(Property.ForName("Id").As("id"))
+ .Add(Property.ForName("Course").As("course"))
+ )
+ .AddOrder(Order.Desc("id"))
+ .SetResultTransformer(Transformers.AliasToBean<CourseMeeting>())
+ .UniqueResult<CourseMeeting>();
+
+ Assert.That(courseMeetingDto.Id, Is.Not.Null);
+ Assert.That(courseMeetingDto.Id.CourseCode, Is.EqualTo(course.CourseCode));
+ Assert.That(courseMeetingDto.Id.Day, Is.EqualTo("Monday"));
+ Assert.That(courseMeetingDto.Id.Location, Is.EqualTo("1313 Mockingbird Lane"));
+ Assert.That(courseMeetingDto.Id.Period, Is.EqualTo(1));
+ Assert.That(courseMeetingDto.Course.Description, Is.EqualTo(course.Description));
+
+ // Subtest #13
s.CreateCriteria(typeof(Student))
.Add(Expression.Like("Name", "Gavin", MatchMode.Start))
.AddOrder(Order.Asc("Name"))
@@ -1209,14 +1477,15 @@
.CreateCriteria("Course", "c")
.AddOrder(Order.Asc("Description"))
.SetProjection(Projections.ProjectionList()
- .Add(Property.ForName("this.Name"))
- .Add(Property.ForName("e.Year"))
- .Add(Property.ForName("e.Semester"))
- .Add(Property.ForName("c.CourseCode"))
- .Add(Property.ForName("c.Description"))
+ .Add(Property.ForName("this.Name"))
+ .Add(Property.ForName("e.Year"))
+ .Add(Property.ForName("e.Semester"))
+ .Add(Property.ForName("c.CourseCode"))
+ .Add(Property.ForName("c.Description"))
)
.UniqueResult();
+ // Subtest #14
ProjectionList p1 = Projections.ProjectionList()
.Add(Property.ForName("StudentNumber").Count())
.Add(Property.ForName("StudentNumber").Max())
@@ -1226,10 +1495,10 @@
.Add(Property.ForName("StudentNumber").Min())
.Add(Property.ForName("StudentNumber").Avg())
.Add(Projections.SqlProjection(
- "1 as constOne, count(*) as countStar",
- new String[] { "constOne", "countStar" },
- new IType[] { NHibernateUtil.Int32, NHibernateUtil.Int32 }
- ));
+ "1 as constOne, count(*) as countStar",
+ new String[] { "constOne", "countStar" },
+ new IType[] { NHibernateUtil.Int32, NHibernateUtil.Int32 }
+ ));
object[] array = (object[])s.CreateCriteria(typeof(Enrolment))
.SetProjection(Projections.ProjectionList().Add(p1).Add(p2))
@@ -1237,18 +1506,49 @@
Assert.AreEqual(7, array.Length);
+ // Subtest #15
IList list = s.CreateCriteria(typeof(Enrolment))
.CreateAlias("Student", "st")
.CreateAlias("Course", "co")
.SetProjection(Projections.ProjectionList()
- .Add(Property.ForName("co.CourseCode").Group())
- .Add(Property.ForName("st.StudentNumber").Count().SetDistinct())
- .Add(Property.ForName("Year").Group())
+ .Add(Property.ForName("co.CourseCode").Group())
+ .Add(Property.ForName("st.StudentNumber").Count().SetDistinct())
+ .Add(Property.ForName("Year").Group())
)
.List();
Assert.AreEqual(2, list.Count);
+ // Subtest #16
+ list = s.CreateCriteria<Enrolment>()
+ .CreateAlias("Student", "st")
+ .CreateAlias("Course", "co")
+ .SetProjection(Projections.ProjectionList()
+ .Add(Property.ForName("co.CourseCode").Group().As("courseCode"))
+ .Add(Property.ForName("st.StudentNumber").Count().SetDistinct().As("studentNumber"))
+ .Add(Property.ForName("Year").Group())
+ )
+ .AddOrder(Order.Asc("courseCode"))
+ .AddOrder(Order.Asc("studentNumber"))
+ .List();
+
+ Assert.That(list.Count, Is.EqualTo(2));
+
+ // Subtest #17
+ list = s.CreateCriteria<Enrolment>()
+ .CreateAlias("Student", "st")
+ .CreateAlias("Course", "co")
+ .SetProjection(Projections.ProjectionList()
+ .Add(Property.ForName("co.CourseCode").Group().As("cCode"))
+ .Add(Property.ForName("st.StudentNumber").Count().SetDistinct().As("stNumber"))
+ .Add(Property.ForName("Year").Group())
+ )
+ .AddOrder(Order.Asc("cCode"))
+ .AddOrder(Order.Asc("stNumber"))
+ .List();
+
+ Assert.That(list.Count, Is.EqualTo(2));
+
s.Delete(gavin);
s.Delete(xam);
s.Delete(course);
@@ -1258,15 +1558,272 @@
}
[Test]
- [Ignore("To be implemented")]
public void DistinctProjectionsOfComponents()
{
+ ISession s = OpenSession();
+ ITransaction t = s.BeginTransaction();
+
+ Course course = new Course();
+ course.CourseCode = "HIB";
+ course.Description = "Hibernate Training";
+ s.Save(course);
+
+ Student gavin = new Student();
+ gavin.Name = "Gavin King";
+ gavin.StudentNumber = 667;
+ gavin.CityState = new CityState("Odessa", "WA");;
+ s.Save(gavin);
+
+ Student xam = new Student();
+ xam.Name = "Max Rydahl Andersen";
+ xam.StudentNumber = 101;
+ xam.PreferredCourse = course;
+ xam.CityState = new CityState("Odessa", "WA");;
+ s.Save(xam);
+
+ Enrolment enrolment = new Enrolment();
+ enrolment.Course = course;
+ enrolment.CourseCode = course.CourseCode;
+ enrolment.Semester = 1;
+ enrolment.Year = 1999;
+ enrolment.Student = xam;
+ enrolment.StudentNumber = xam.StudentNumber;
+ xam.Enrolments.Add(enrolment);
+ s.Save(enrolment);
+
+ enrolment = new Enrolment();
+ enrolment.Course = course;
+ enrolment.CourseCode = course.CourseCode;
+ enrolment.Semester = 3;
+ enrolment.Year = 1998;
+ enrolment.Student = gavin;
+ enrolment.StudentNumber = gavin.StudentNumber;
+ gavin.Enrolments.Add(enrolment);
+ s.Save(enrolment);
+ s.Flush();
+
+ object result = s.CreateCriteria<Student>()
+ .SetProjection(Projections.Distinct(Property.ForName("CityState")))
+ .UniqueResult();
+
+ Assert.That(result, Is.InstanceOf<CityState>());
+ Assert.That(((CityState)result).City, Is.EqualTo("Odessa"));
+ Assert.That(((CityState)result).State, Is.EqualTo("WA"));
+
+ result = s.CreateCriteria<Student>()
+ .SetProjection(Projections.Distinct(Property.ForName("CityState").As("cityState")))
+ .AddOrder(Order.Asc("cityState"))
+ .UniqueResult();
+
+ Assert.That(result, Is.InstanceOf<CityState>());
+ Assert.That(((CityState)result).City, Is.EqualTo("Odessa"));
+ Assert.That(((CityState)result).State, Is.EqualTo("WA"));
+
+ result = s.CreateCriteria<Student>()
+ .SetProjection(Projections.Count("CityState.City"))
+ .UniqueResult();
+
+ Assert.That(result, Is.EqualTo(2));
+
+ result = s.CreateCriteria<Student>()
+ .SetProjection(Projections.CountDistinct("CityState.City"))
+ .UniqueResult();
+
+ Assert.That(result, Is.EqualTo(1));
+
+ t.Commit();
+ s.Close();
+
+// s = OpenSession();
+// t = s.BeginTransaction();
+// try
+// {
+// result = s.CreateCriteria<Student>()
+// .SetProjection(Projections.Count("CityState"))
+// .UniqueResult();
+//
+// if (!Dialect.SupportsTupleCounts)
+// {
+// fail( "expected SQLGrammarException" );
+// }
+//
+// Assert.That((long)result, Is.EqualTo(1L));
+// }
+// catch (NHibernate.Exceptions.SQLGrammarException ex)
+// {
+// throw ex;
+// if (!Dialect.SupportsTupleCounts)
+// {
+// // expected
+// }
+// else
+// {
+// throw ex;
+// }
+// }
+// finally
+// {
+// t.Rollback();
+// s.Close();
+// }
+
+// s = OpenSession();
+// t = s.BeginTransaction();
+// try
+// {
+// result = s.CreateCriteria<Student>()
+// .SetProjection(Projections.CountDistinct("CityState"))
+// .UniqueResult();
+//
+// if (!Dialect.SupportsTupleDistinctCounts)
+// {
+// fail("expected SQLGrammarException");
+// }
+//
+// Assert.That((long)result, Is.EqualTo(1L));
+// }
+// catch (NHibernate.Exceptions.SQLGrammarException ex)
+// {
+// throw ex;
+// if (Dialect.SupportsTupleDistinctCounts)
+// {
+// // expected
+// }
+// else
+// {
+// throw ex;
+// }
+// }
+// finally
+// {
+// t.Rollback();
+// s.Close();
+// }
+
+ s = OpenSession();
+ t = s.BeginTransaction();
+ s.Delete(gavin);
+ s.Delete(xam);
+ s.Delete(course);
+
+ t.Commit();
+ s.Close();
}
[Test]
- [Ignore("To be implemented")]
public void GroupByComponent()
{
+ ISession s = OpenSession();
+ ITransaction t = s.BeginTransaction();
+
+ Course course = new Course();
+ course.CourseCode = "HIB";
+ course.Description = "Hibernate Training";
+ s.Save(course);
+
+ Student gavin = new Student();
+ gavin.Name = "Gavin King";
+ gavin.StudentNumber = 667;
+ gavin.CityState = new CityState("Odessa", "WA");;
+ s.Save(gavin);
+
+ Student xam = new Student();
+ xam.Name = "Max Rydahl Andersen";
+ xam.StudentNumber = 101;
+ xam.PreferredCourse = course;
+ xam.CityState = new CityState("Odessa", "WA");;
+ s.Save(xam);
+
+ Enrolment enrolment = new Enrolment();
+ enrolment.Course = course;
+ enrolment.CourseCode = course.CourseCode;
+ enrolment.Semester = 1;
+ enrolment.Year = 1999;
+ enrolment.Student = xam;
+ enrolment.StudentNumber = xam.StudentNumber;
+ xam.Enrolments.Add(enrolment);
+ s.Save(enrolment);
+
+ enrolment = new Enrolment();
+ enrolment.Course = course;
+ enrolment.CourseCode = course.CourseCode;
+ enrolment.Semester = 3;
+ enrolment.Year = 1998;
+ enrolment.Student = gavin;
+ enrolment.StudentNumber = gavin.StudentNumber;
+ gavin.Enrolments.Add(enrolment);
+ s.Save(enrolment);
+ s.Flush();
+
+ object result = s.CreateCriteria<Student>()
+ .SetProjection(Projections.GroupProperty("CityState"))
+ .UniqueResult();
+
+ Assert.That(result, Is.InstanceOf<CityState>());
+ Assert.That(((CityState)result).City, Is.EqualTo("Odessa"));
+ Assert.That(((CityState)result).State, Is.EqualTo("WA"));
+
+ result = s.CreateCriteria<Student>("st")
+ .SetProjection(Projections.GroupProperty("st.CityState"))
+ .UniqueResult();
+
+ Assert.That(result, Is.InstanceOf<CityState>());
+ Assert.That(((CityState)result).City, Is.EqualTo("Odessa"));
+ Assert.That(((CityState)result).State, Is.EqualTo("WA"));
+
+ result = s.CreateCriteria<Student>("st")
+ .SetProjection(Projections.GroupProperty("st.CityState"))
+ .AddOrder(Order.Asc("CityState"))
+ .UniqueResult();
+
+ Assert.That(result, Is.InstanceOf<CityState>());
+ Assert.That(((CityState)result).City, Is.EqualTo("Odessa"));
+ Assert.That(((CityState)result).State, Is.EqualTo("WA"));
+
+ result = s.CreateCriteria<Student>("st")
+ .SetProjection(Projections.GroupProperty("st.CityState").As("cityState"))
+ .AddOrder(Order.Asc("cityState"))
+ .UniqueResult();
+
+ Assert.That(result, Is.InstanceOf<CityState>());
+ Assert.That(((CityState)result).City, Is.EqualTo("Odessa"));
+ Assert.That(((CityState)result).State, Is.EqualTo("WA"));
+
+ result = s.CreateCriteria<Student>("st")
+ .SetProjection(Projections.GroupProperty("st.CityState").As("cityState"))
+ .AddOrder(Order.Asc("cityState"))
+ .UniqueResult();
+
+ Assert.That(result, Is.InstanceOf<CityState>());
+ Assert.That(((CityState)result).City, Is.EqualTo("Odessa"));
+ Assert.That(((CityState)result).State, Is.EqualTo("WA"));
+
+ result = s.CreateCriteria<Student>("st")
+ .SetProjection(Projections.GroupProperty("st.CityState").As("cityState"))
+ .Add(Restrictions.Eq("st.CityState", new CityState("Odessa", "WA")))
+ .AddOrder(Order.Asc("cityState"))
+ .UniqueResult();
+
+ Assert.That(result, Is.InstanceOf<CityState>());
+ Assert.That(((CityState)result).City, Is.EqualTo("Odessa"));
+ Assert.That(((CityState)result).State, Is.EqualTo("WA"));
+
+ IList list = s.CreateCriteria<Enrolment>()
+ .CreateAlias("Student", "st")
+ .CreateAlias("Course", "co")
+ .SetProjection(Projections.ProjectionList()
+ .Add(Property.ForName("co.CourseCode").Group())
+ .Add(Property.ForName("st.CityState").Group())
+ .Add(Property.ForName("Year").Group())
+ )
+ .List();
+
+ s.Delete(gavin);
+ s.Delete(xam);
+ s.Delete(course);
+
+ t.Commit();
+ s.Close();
}
[Test]
@@ -1624,9 +2181,24 @@
}
[Test]
- [Ignore("To be implemented")]
public void ProjectedCompositeIdWithAlias()
{
+ using (ISession s = OpenSession())
+ using (ITransaction t = s.BeginTransaction())
+ {
+ Course course = new Course();
+ course.CourseCode = "HIB";
+ course.Description = "Hibernate Training";
+ course.CourseMeetings.Add(new CourseMeeting(course, "Monday", 1, "1313 Mockingbird Lane"));
+ s.Save(course);
+ s.Flush();
+
+ IList data = (IList)s.CreateCriteria<CourseMeeting>()
+ .SetProjection(Projections.Id().As("id"))
+ .List();
+
+ t.Rollback();
+ }
}
[Test]
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|