请注明转载地址:http://www.cnblogs.com/arhat
在上一章中,老魏带着大家学习了HQL语句,发现HQL语句还是非常不错的,尤其是在懒加载的时候,书写起来比较的舒服,但是这里老魏还得再次的说明一定要转换思想,HQL是对对象的查询,所以不应该还想着对表的操作,尤其是where条件中,更是把对对象的查询体现出来了。比如在本章,老魏接着和大家一起来讨论一下HQL语句。
根据上面的问题,我们来看看下面的查询是如何做的。请查询出位于班级号为1的学生的姓名和班级名称。我们更改一下主程序的代码如下:
static void Main(string[] args) { //定义一个HQL语句 string hql = "select SName,Clazz.CName from Student where Clazz.CId=?"; //创建一个IQuery对象 NHibernate.IQuery query = DAL.NHibernateHelper.GetCurrentSession().CreateQuery(hql); query.SetParameter(0, 1); //执行IQuery对象,并把结果取出来 IList<object[]> list = query.List<object[]>(); foreach (object[] objs in list) { Console.WriteLine("姓名:" + objs[0] + ",性别:" + objs[1]); } }
我们来分析一下这个HQL语句:
select SName,Clazz.CName from Student where Clazz.CId=?
由于Student和Clazz之间的关系,我们在创建Student和Clazz对象的时候,就在Student中创建了一个关联的对象属性Clazz。那么现在我们要查询的是在班级为1中的学生的姓名和班级名称,那么我们应该查询的是Student对象,通过关联属相来指定要查询的字段。并在尤其在where中,通过关联的属性来制定要查询的条件CId。运行一下,看看结果。
这道题已经把NHibernate中的一些重要的知识点给体验出来了,所以再次强调HQL查询的是对象和对象的属性,所在在HQL中应该写的就是对象和对象的属性。
好,这是老魏上一章遗留下来的问题,那下面的内容就开始继续讲述HQL中的一些查询,在开始之前我们需要在Student表中插入一个Sage的字段并插入相关数据配合本章的查询。同时需要给Student.cs和Student.hbm.xml文件添加对象的属性。
1,between ... and
现在,老魏要查询一下年龄在30到50之间的学生信息。更改一下主程序:
static void Main(string[] args) { //定义一个HQL语句 string hql = "select SName,SAge from Student where SAge between 30 and 50"; //创建一个IQuery对象 NHibernate.IQuery query = DAL.NHibernateHelper.GetCurrentSession().CreateQuery(hql); //执行IQuery对象,并把结果取出来 IList<object[]> list = query.List<object[]>(); foreach (object[] objs in list) { Console.WriteLine("姓名:" + objs[0] + ",年龄:" + objs[1]); } }
2,order by
根据上面的结果,对结果进行一个根据年龄的大小从大到小排列数据
string hql = "select SName,SAge from Student where SAge between 30 and 50 order by SAge desc";
3,like 模糊查询
string hql = "select SName,SAge from Student where SName like '%济%'";
4,in和 not in
string hql = "select SName,SAge from Student where SAge in (33,25,18)";
string hql = "select SName,SAge from Student where SAge not in (33,25,18)";
5,聚合函数,AVG,Sum,Count
//定义一个HQL语句 string hql = "select avg(SAge) from Student where SAge not in (33,25,18)"; //创建一个IQuery对象 NHibernate.IQuery query = DAL.NHibernateHelper.GetCurrentSession().CreateQuery(hql); //执行IQuery对象,并把结果取出来 IList<double> list = query.List<double>(); foreach (double objs in list) { Console.WriteLine("学生的平均年龄为:" + objs); }
至于SUM,Count这里老魏就不在演示了,大家可以自行测试。
6,group by 和 having语句
分别求出每个部门的总人数。
//定义一个HQL语句 string hql = "select count(*),Clazz.CId from Student group by Clazz.CId"; //创建一个IQuery对象 NHibernate.IQuery query = DAL.NHibernateHelper.GetCurrentSession().CreateQuery(hql); //执行IQuery对象,并把结果取出来 IList<Object[]> list = query.List<Object[]>(); foreach (Object[] objs in list) { Console.WriteLine("班级:" + objs[1]+",总人数:"+objs[0]); }
求出总人数大于2的班级名称。
string hql = "select count(*),Clazz.CName from Student group by Clazz.CId having count(*) >2";
本章到这里基本上就差不多把基本的查询讲述完毕了,那么在下一章中,我们主要来阐述一下连接查询和子查询。