一步步学习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。运行一下,看看结果。
wps_clip_image-26929

这道题已经把NHibernate中的一些重要的知识点给体验出来了,所以再次强调HQL查询的是对象和对象的属性,所在在HQL中应该写的就是对象和对象的属性。

好,这是老魏上一章遗留下来的问题,那下面的内容就开始继续讲述HQL中的一些查询,在开始之前我们需要在Student表中插入一个Sage的字段并插入相关数据配合本章的查询。同时需要给Student.cs和Student.hbm.xml文件添加对象的属性。

wps_clip_image-24805

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]);

            }

        }

wps_clip_image-9025

2,order by

根据上面的结果,对结果进行一个根据年龄的大小从大到小排列数据

string hql = "select SName,SAge from Student where SAge between 30 and 50 order by SAge desc";

wps_clip_image-6322

3,like 模糊查询

string hql = "select SName,SAge from Student where SName like '%济%'";

wps_clip_image-6147

4,in和 not in

string hql = "select SName,SAge from Student where SAge in (33,25,18)";

wps_clip_image-31633

string hql = "select SName,SAge from Student where SAge not in (33,25,18)";

wps_clip_image-27415

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);

            }

wps_clip_image-20964

至于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]);

            }

wps_clip_image-12689

求出总人数大于2的班级名称。

string hql = "select count(*),Clazz.CName from Student group by Clazz.CId having count(*) >2";

wps_clip_image-31171

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

原文地址:https://www.cnblogs.com/arhat/p/3576157.html