一步步学习NHibernate(8)——HQL查询(2)
请注明转载地址: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)的更多相关文章
- 一步步学习NHibernate(7)——HQL查询(1)
请注明转载地址:http://www.cnblogs.com/arhat 从本章开始,老魏带着大家来学习一下HQL语句.HQL语句NHibernate为我们提供的一种功能比较强大的查询语句,这个HQL ...
- 一步步学习NHibernate(10)——连接查询和子查询(2)
请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,老魏讲述了HQL的链接查询,本章呢,老魏开始讲述HQL的子查询.子查询在SQL中也是占据着非常重要的作用,如果没有 ...
- 一步步学习NHibernate(9)——连接查询和子查询(1)
请注明转载地址:http://www.cnblogs.com/arhat 在前几章中,我们把HQL的基本查询学习了一下,但是只有基本查询很显然不能满足我们的需求,那么就需要一下复杂查询比如" ...
- 一步步学习NHibernate(4)——多对一,一对多,懒加载(1)
请注明转载地址:http://www.cnblogs.com/arhat 通过上一章的学习,我们学会如何使用NHibernate对数据的简单查询,删除,更新和插入,那么如果说仅仅是这样的话,那么NHi ...
- 一步步学习NHibernate(1)——NHibernate介绍
请注明转载地址:http://www.cnblogs.com/arhat 第十五章 从本章开始,老魏将给大家一起学习NHibernate这个流行的ORM框架,本来老魏想要和大家一起探讨微软的EF框架的 ...
- Hibernate学习笔记-Hibernate HQL查询
Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...
- 一步步学习NHibernate(3)——NHibernate增删改查
请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,我们配置了以下NHibernate的运行环境, 并介绍了NHibernate的中两个非常中重要的接口"I ...
- 一步步学习NHibernate(6)——ISession的管理
请注明转载地址:http://www.cnblogs.com/arhat 今天老魏那个汗啊,我的ThinkPad的电源线不通电了,擦啊.明天还得掏银子买一个!心疼啊,原装的啊.不过话说回来,已经用了将 ...
- 一步步学习NHibernate(5)——多对一,一对多,懒加载(2)
请注明转载地址:http://www.cnblogs.com/arhat 通过上一章的学习,我们建立了Student和Clazz之间的关联属性,并从Student(many)的一方查看了Clazz的信 ...
随机推荐
- linux剪切拷贝
1.剪切 mv rename.sh ../rename.sh 把这个文件移到上一级目录下 mv rename.sh ./pic/rename.sh 把这个文件移到 当前目录下的pic目录下,并改名 ...
- Android(java)学习笔记121:android.intent.action.MAIN 与 android.intent.category.LAUNCHER 理解
先看看网路上的说法: android.intent.action.MAIN决定应用程序最先启动的 Activity android.intent.category.LAUNCHER决定应用程序是否显示 ...
- GCC生成的汇编代码
假设我们写了一个C代码文件 code.c包含下面代码: int accum = 0; int sum(int x, int y){ int t = x + y; accum += t; return ...
- Python 基础【第八篇】变量
1.变量定义: 给数据进行命名,数据的名字就叫做变量 2.变量格式: [变量名] = [值] 注:变量名命名需要满足下面两条准则 准则一:标示符开头不能为数字.不能包含空格.特殊字符准则二:标示符不能 ...
- 在Ubuntu Linux下安装Code::Blocks和Eclipse CDT
最近小白由于有工作学习的需要,要尝试在Linux下进行C++编程.所以特地花了一点时间研究一下Linux下的C++的IDE.最后我尝试了使用Code::Blocks和Eclipse两个著 ...
- 如何给windows窗体程序打包成一个安装包
http://blog.csdn.net/xyy410874116/article/details/6341787 给windows窗体程序打包成一个安装包:具体操作在:http://hi.baidu ...
- glassfish 日志输出配置
asadmin set-log-levels javax.enterprise.system.tools.deployment=WARNING
- 通过自关联替代开窗函数实现SQL优化
数据库环境:SQL SERVER 2005 我们平时都是通过开窗析函数来取代自关联,减少表扫描,从而优化SQL.今天,反其道而行, 用自关联改写开窗函数.我们先来看一下SQL. 原SQL语句 SELE ...
- ASP.NET Web Service如何工作(2)
ASP.NET Web Service如何工作(2) [日期:2003-06-26] 来源:CSDN 作者:sunnyzhao(翻译) [字体:大 中 小] HTTP管道一旦调用了.asmx句柄,便 ...
- shell 数组
数组赋值:(1) array=(var1 var2 var3 ... varN)(2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)(3) array ...