首页 > 其他 > 详细

一步步学习NHibernate(8)——HQL查询(2)

时间:2014-03-03 00:53:43      阅读:582      评论:0      收藏:0      [点我收藏+]

请注明转载地址:http://www.cnblogs.com/arhat

在上一章中,老魏带着大家学习了HQL语句,发现HQL语句还是非常不错的,尤其是在懒加载的时候,书写起来比较的舒服,但是这里老魏还得再次的说明一定要转换思想,HQL是对对象的查询,所以不应该还想着对表的操作,尤其是where条件中,更是把对对象的查询体现出来了。比如在本章,老魏接着和大家一起来讨论一下HQL语句。

根据上面的问题,我们来看看下面的查询是如何做的。请查询出位于班级号为1的学生的姓名和班级名称。我们更改一下主程序的代码如下:

bubuko.com,布布扣
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]);

            }

        }
bubuko.com,布布扣

我们来分析一下这个HQL语句:

bubuko.com,布布扣
select SName,Clazz.CName from Student where Clazz.CId=?
bubuko.com,布布扣

由于Student和Clazz之间的关系,我们在创建Student和Clazz对象的时候,就在Student中创建了一个关联的对象属性Clazz。那么现在我们要查询的是在班级为1中的学生的姓名和班级名称,那么我们应该查询的是Student对象,通过关联属相来指定要查询的字段。并在尤其在where中,通过关联的属性来制定要查询的条件CId。运行一下,看看结果。
bubuko.com,布布扣

这道题已经把NHibernate中的一些重要的知识点给体验出来了,所以再次强调HQL查询的是对象和对象的属性,所在在HQL中应该写的就是对象和对象的属性。

好,这是老魏上一章遗留下来的问题,那下面的内容就开始继续讲述HQL中的一些查询,在开始之前我们需要在Student表中插入一个Sage的字段并插入相关数据配合本章的查询。同时需要给Student.cs和Student.hbm.xml文件添加对象的属性。

bubuko.com,布布扣

1,between ... and

现在,老魏要查询一下年龄在30到50之间的学生信息。更改一下主程序:

bubuko.com,布布扣
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]);

            }

        }
bubuko.com,布布扣

bubuko.com,布布扣

2,order by

根据上面的结果,对结果进行一个根据年龄的大小从大到小排列数据

bubuko.com,布布扣
string hql = "select SName,SAge from Student where SAge between 30 and 50 order by SAge desc";
bubuko.com,布布扣

bubuko.com,布布扣

3,like 模糊查询

bubuko.com,布布扣
string hql = "select SName,SAge from Student where SName like ‘%济%‘";
bubuko.com,布布扣

bubuko.com,布布扣

4,in和 not in

bubuko.com,布布扣
string hql = "select SName,SAge from Student where SAge in (33,25,18)";
bubuko.com,布布扣

bubuko.com,布布扣

bubuko.com,布布扣
string hql = "select SName,SAge from Student where SAge not in (33,25,18)";
bubuko.com,布布扣

bubuko.com,布布扣

5,聚合函数,AVG,Sum,Count

bubuko.com,布布扣
//定义一个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);

            }
bubuko.com,布布扣

bubuko.com,布布扣

至于SUM,Count这里老魏就不在演示了,大家可以自行测试。

6,group by 和 having语句

分别求出每个部门的总人数。

bubuko.com,布布扣
//定义一个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]);

            }
bubuko.com,布布扣

bubuko.com,布布扣

求出总人数大于2的班级名称。

bubuko.com,布布扣
string hql = "select count(*),Clazz.CName from Student group by Clazz.CId having count(*) >2";
bubuko.com,布布扣

bubuko.com,布布扣

本章到这里基本上就差不多把基本的查询讲述完毕了,那么在下一章中,我们主要来阐述一下连接查询和子查询。

一步步学习NHibernate(8)——HQL查询(2),布布扣,bubuko.com

一步步学习NHibernate(8)——HQL查询(2)

原文:http://www.cnblogs.com/arhat/p/3576157.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!