请注明转载地址: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";

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

一步步学习NHibernate(8)——HQL查询(2)的更多相关文章

  1. 一步步学习NHibernate(7)——HQL查询(1)

    请注明转载地址:http://www.cnblogs.com/arhat 从本章开始,老魏带着大家来学习一下HQL语句.HQL语句NHibernate为我们提供的一种功能比较强大的查询语句,这个HQL ...

  2. 一步步学习NHibernate(10)——连接查询和子查询(2)

    请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,老魏讲述了HQL的链接查询,本章呢,老魏开始讲述HQL的子查询.子查询在SQL中也是占据着非常重要的作用,如果没有 ...

  3. 一步步学习NHibernate(9)——连接查询和子查询(1)

    请注明转载地址:http://www.cnblogs.com/arhat 在前几章中,我们把HQL的基本查询学习了一下,但是只有基本查询很显然不能满足我们的需求,那么就需要一下复杂查询比如" ...

  4. 一步步学习NHibernate(4)——多对一,一对多,懒加载(1)

    请注明转载地址:http://www.cnblogs.com/arhat 通过上一章的学习,我们学会如何使用NHibernate对数据的简单查询,删除,更新和插入,那么如果说仅仅是这样的话,那么NHi ...

  5. 一步步学习NHibernate(1)——NHibernate介绍

    请注明转载地址:http://www.cnblogs.com/arhat 第十五章 从本章开始,老魏将给大家一起学习NHibernate这个流行的ORM框架,本来老魏想要和大家一起探讨微软的EF框架的 ...

  6. Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...

  7. 一步步学习NHibernate(3)——NHibernate增删改查

    请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,我们配置了以下NHibernate的运行环境, 并介绍了NHibernate的中两个非常中重要的接口"I ...

  8. 一步步学习NHibernate(6)——ISession的管理

    请注明转载地址:http://www.cnblogs.com/arhat 今天老魏那个汗啊,我的ThinkPad的电源线不通电了,擦啊.明天还得掏银子买一个!心疼啊,原装的啊.不过话说回来,已经用了将 ...

  9. 一步步学习NHibernate(5)——多对一,一对多,懒加载(2)

    请注明转载地址:http://www.cnblogs.com/arhat 通过上一章的学习,我们建立了Student和Clazz之间的关联属性,并从Student(many)的一方查看了Clazz的信 ...

随机推荐

  1. 关于c#中委托使用小结

    一.简述: 委托对与我们编程人员来说,一点都不陌生,在实际工作过程中,或多或少都应该是接触过 但是对与编程新手来说,对与委托的理解和使用应该还是一个坎,但是只要理解清楚了,这个坎也就过去了. 最近也经 ...

  2. oracle字段类型

    oracle 字段类型CHAR    固定长度字符串    最大长度2000    bytes              VARCHAR2    可变长度的字符串    最大长度4000    byt ...

  3. CSS3 旋转的八卦图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 将Oracle表导入到Access方法,已经安装了Access但Win7提示 找不到access driver

    已经安装了Access但Win7提示 找不到access driver: 1.打开 "C:\Windows\SysWOW64\odbcad32.exe" 2.管理员cmd运行 命令 ...

  5. Greedy

    在现实世界中,有这样一类问题:它有n个输入,而它的解就由这n个输入的某个子集组成,不过这个子集必须满足某些事先给定的条件.把那些必须满足的条件称为约束条件:而把满足约束条件的子集称为该问题的可行解.问 ...

  6. 求关注 wcf bindipendpointdelegate 端口限制的功能

    我最近也需要实现一个功能:1)一个客户端(192.168.0.15),10个服务端(提供A接口.B接口)如下:      192.168.0.1-5685       192.168.0.2-5685 ...

  7. 【转】android自动化测试之MonkeyRunner使用实例(三)

    一.使用CMD命令打开模拟器 运行monkeyrunner之前必须先运行相应的模拟器或连上设备,不然monkeyrunner无法连接设备. 1.1  用Elipse打开Android模拟器或在CMD中 ...

  8. PM2 管理nodejs项目

    pm2 是一个带有负载均衡功能的Node应用的进程管理器. 当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的. 它非常适合IaaS结构,但不要把它 ...

  9. C++多态性与C#的比较

        多态性:统一操作作用于不同的对象可以有不同的解释,产生不同的执行结果.多态性可以分为两种:一是编译时的多态性,一是运行时的多态性.     编译时的多态性包括重载.覆盖.运算符重载.对于非虚的 ...

  10. SecureCRT自动断开连接的问题

    直接在虚拟机上ssh道实验室的服务器时并没有发现过上一段时间不操作就会断开,可能是我没有注意,也能是操作时间间隔比较短. 但是在secureCRT上登录时,发现经常的断开,很是郁闷,所以baidu了一 ...