一步步学习NHibernate(8)——HQL查询(2)
2014-03-02 00:22
281 查看
请注明转载地址:http://www.cnblogs.com/arhat
在上一章中,老魏带着大家学习了HQL语句,发现HQL语句还是非常不错的,尤其是在懒加载的时候,书写起来比较的舒服,但是这里老魏还得再次的说明一定要转换思想,HQL是对对象的查询,所以不应该还想着对表的操作,尤其是where条件中,更是把对对象的查询体现出来了。比如在本章,老魏接着和大家一起来讨论一下HQL语句。
根据上面的问题,我们来看看下面的查询是如何做的。请查询出位于班级号为1的学生的姓名和班级名称。我们更改一下主程序的代码如下:
我们来分析一下这个HQL语句:
由于Student和Clazz之间的关系,我们在创建Student和Clazz对象的时候,就在Student中创建了一个关联的对象属性Clazz。那么现在我们要查询的是在班级为1中的学生的姓名和班级名称,那么我们应该查询的是Student对象,通过关联属相来指定要查询的字段。并在尤其在where中,通过关联的属性来制定要查询的条件CId。运行一下,看看结果。
![](http://images.cnitblog.com/blog/600656/201403/020020480824021.png)
这道题已经把NHibernate中的一些重要的知识点给体验出来了,所以再次强调HQL查询的是对象和对象的属性,所在在HQL中应该写的就是对象和对象的属性。
好,这是老魏上一章遗留下来的问题,那下面的内容就开始继续讲述HQL中的一些查询,在开始之前我们需要在Student表中插入一个Sage的字段并插入相关数据配合本章的查询。同时需要给Student.cs和Student.hbm.xml文件添加对象的属性。
![](http://images.cnitblog.com/blog/600656/201403/020020535117710.png)
1,between ... and
现在,老魏要查询一下年龄在30到50之间的学生信息。更改一下主程序:
![](http://images.cnitblog.com/blog/600656/201403/020020558899869.png)
2,order by
根据上面的结果,对结果进行一个根据年龄的大小从大到小排列数据
![](http://images.cnitblog.com/blog/600656/201403/020020586585316.png)
3,like 模糊查询
![](http://images.cnitblog.com/blog/600656/201403/020021010979731.png)
4,in和 not in
![](http://images.cnitblog.com/blog/600656/201403/020021042103048.png)
![](http://images.cnitblog.com/blog/600656/201403/020021074922351.png)
5,聚合函数,AVG,Sum,Count
![](http://images.cnitblog.com/blog/600656/201403/020021101768837.png)
至于SUM,Count这里老魏就不在演示了,大家可以自行测试。
6,group by 和 having语句
分别求出每个部门的总人数。
![](http://images.cnitblog.com/blog/600656/201403/020021125673469.png)
求出总人数大于2的班级名称。
![](http://images.cnitblog.com/blog/600656/201403/020021153574685.png)
本章到这里基本上就差不多把基本的查询讲述完毕了,那么在下一章中,我们主要来阐述一下连接查询和子查询。
在上一章中,老魏带着大家学习了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。运行一下,看看结果。
![](http://images.cnitblog.com/blog/600656/201403/020020480824021.png)
这道题已经把NHibernate中的一些重要的知识点给体验出来了,所以再次强调HQL查询的是对象和对象的属性,所在在HQL中应该写的就是对象和对象的属性。
好,这是老魏上一章遗留下来的问题,那下面的内容就开始继续讲述HQL中的一些查询,在开始之前我们需要在Student表中插入一个Sage的字段并插入相关数据配合本章的查询。同时需要给Student.cs和Student.hbm.xml文件添加对象的属性。
![](http://images.cnitblog.com/blog/600656/201403/020020535117710.png)
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]); } }
![](http://images.cnitblog.com/blog/600656/201403/020020558899869.png)
2,order by
根据上面的结果,对结果进行一个根据年龄的大小从大到小排列数据
string hql = "select SName,SAge from Student where SAge between 30 and 50 order by SAge desc";
![](http://images.cnitblog.com/blog/600656/201403/020020586585316.png)
3,like 模糊查询
string hql = "select SName,SAge from Student where SName like '%济%'";
![](http://images.cnitblog.com/blog/600656/201403/020021010979731.png)
4,in和 not in
string hql = "select SName,SAge from Student where SAge in (33,25,18)";
![](http://images.cnitblog.com/blog/600656/201403/020021042103048.png)
string hql = "select SName,SAge from Student where SAge not in (33,25,18)";
![](http://images.cnitblog.com/blog/600656/201403/020021074922351.png)
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); }
![](http://images.cnitblog.com/blog/600656/201403/020021101768837.png)
至于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]); }
![](http://images.cnitblog.com/blog/600656/201403/020021125673469.png)
求出总人数大于2的班级名称。
string hql = "select count(*),Clazz.CName from Student group by Clazz.CId having count(*) >2";
![](http://images.cnitblog.com/blog/600656/201403/020021153574685.png)
本章到这里基本上就差不多把基本的查询讲述完毕了,那么在下一章中,我们主要来阐述一下连接查询和子查询。
相关文章推荐
- 一步步学习NHibernate(7)——HQL查询(1)
- 一步步学习NHibernate(9)——连接查询和子查询(1)
- 一步步学习NHibernate(10)——连接查询和子查询(2)
- 一步步学习NHibernate(2)——配置NHibernate的环境
- 一步步学习NHibernate(4)——多对一,一对多,懒加载(1)
- 一步步学习NHibernate(3)——NHibernate增删改查
- 一步步学习NHibernate(1)——NHibernate介绍
- Castle学习笔记----使用HQL语句实现复杂查询
- Hibernate的学习之路十七(HQL条件查询)
- C#.Net Castle ActiveRecord学习实践(7):使用HQL查询
- Hibernate的学习之路三十(HQL的基本查询)、
- Hibernate的学习之路三十二(HQL的聚合函数查询)
- Oracle的基本学习(二)—基本查询
- Hibernate学习27 -- Hibernate查询语言(HQL)1 -- 准备
- 面向对象的NHibernate数据查询语言-HQL
- JAVAEE学习——hibernate04:查询种类、HQL、Criteria、查询优化和练习为客户列表增加查询条件
- 面向对象的NHibernate数据查询语言-HQL
- hibernate框架学习笔记10:HQL查询详解
- Hibernate的学习之路十七(HQL条件查询)
- NHibernate(2) HQL 条件查询(QBC) - 分页,统计,排序