一步步学习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的信 ...
随机推荐
- Android 自定义View修炼-高仿猎豹清理大师自定义内存开口圆环比例进度View
一.概述 看见猎豹清理大师的内存开口圆环比例进度 挺有意思的,于是就是想自己实现下这样的效果,于是反编译了猎豹清理 大师的app看了下,原来是有两张图,于是脑子里就过了下思路,利用上下两张图,旋转上面 ...
- ios定制中间突出的tabBar
我觉得有两个思路,一个是自己写tabBar 通过自定义实现,缺点呢就是比较麻烦,优点就是代码比较清楚,而且比较稳定. 另一个思路就是写个大按钮加在tabBar上 通过监听tabitem的点击来实现相 ...
- c++算法联系,冒泡排序,bubble sort,插入排序,insert sort,
#include <iostream.h> #define MAX 100 void dispaly(int a[],int n) { for(int i=0;i<n;i+ ...
- 关于Java基本数据类型
Java的基本数据类型分为两大类:boolean类型和数字类型.而数值类型又分为整数类型和浮点类型.而整数类型中的字符类型也可以被单独对待. 总共是4类8种. byte类型整数在内存里占8位. -12 ...
- 【并查集】PKU-1182 食物链
食物链 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不 ...
- [转]Markdown 11种基本语法
Markdown 11种基本语法 现在是我在学习Markdown时做的笔记.学完这些Markdown的基本使用已经不成问题. 1. 标题设置(让字体变大,和word的标题意思一样) 在Markdown ...
- webform处理过程
一.post/get传值注意几点 post提交的时候,只有写了name属性且没有写disable=true表单元素(input,select,textarea)才会被提交. 如果不确定是get还是po ...
- 利用FSO取得BMP,JPG,PNG,GIF文件信息(大小,宽、高等)
利用FSO取得BMP,JPG,PNG,GIF文件信息(大小,宽.高等) 程序代码 <% ':::BMP, GIF, JPG and PNG ':::This function gets a sp ...
- Sqlserver 安装
安装环境: SqlServer版本:Sql Server 2008 (安装包您应该已有准备) =============以下开始安装,多图,基本软件操作不做太多说明,注意查看图片=========== ...
- powerdesign设置实体显示格式
工具-显示参数选择中,如下图: