一步步学习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的信 ...
随机推荐
- 深入理解计算机系统第二版习题解答CSAPP 2.12
对于下面的值,写出变量x的C语言表达式.代码应该对任何字长w≥8都能工作.我们给出当x=0x87654321以及w=32时表达式的结果,仅供参考. A.x的最低有效字节,其他位均为0.[0x00000 ...
- 转:vim----复制粘贴
vim有12个粘贴板,分别是0.1.2.....9.a.“.+:用:reg命令可以查看各个粘贴板里的内容.在vim中简单用y只是复制到“(双引号)粘贴板里,同样用p粘贴的也是这个粘贴板里的内容: 要将 ...
- Unit Testing PowerShell Code with Pester
Summary: Guest blogger, Dave Wyatt, discusses using Pester to analyze small pieces of Windows PowerS ...
- gitHub添加公钥
gitHub添加公钥 gitHub是通过SSH公钥连接到现有仓库的 设置SSH Key ssh-keygen -t rsa -C "your_email@example.com"G ...
- 用ASP生成RSS
<% Response.Clear Response.CharSet="gb2312" '数据集 Response.ContentType="text/xml&qu ...
- union判断CPU是little-endian还是big-endian存储
利用联合体的特殊存储方式,便能检测出来cpu所使用的事big-endian或者是little-endian的存储方式. 1.判断系统是Big liden 或者是little ledin 方法1:in ...
- Hibernate+struts+JqueryAjax+jSON实现无刷新三级联动
看网上JqueryAjax三级联动的例子讲不是很全,代码也给的不是很全,给初学者带来一定的难度.小弟自己写了一个,可能有些地方不是很好,希望大家能够提出建议. 用的是Hibernate+struts2 ...
- Drbd 安装配置
一.Drbd介绍 Distributed Replicated Block Device(DRBD)是基于块设备在不同的高可用服务器之间同步和镜像数据的软件,通过它可以实现在网络中两台服务器这间基于块 ...
- zxing.dll生成条码
引入zxing.dll using System; using System.Drawing; using ZXing.QrCode; using ZXing; using ZXing.Common; ...
- Ext.Net 布局
Ext.Net 布局 Panel布局类有10种:容器布局,自适应布局,折叠布局,卡片式布局,锚点布局,绝对位置布局,表单布局,列布局,表格布局,边框布局 1,Ext.layout.Cont ...