请注明转载地址: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. Migration from Zend Framework v2 to v3

    Migration from Zend Framework v2 to v3 Zend Framework v2 to v3 has been intended as an incremental u ...

  2. Java 之 调用.Net的 WebService 整理

    最近做一个 java 调用 .net 服务的项目,其中 .net做了一个WebService,需要java来调用. 最开始.net的Service代码如下: using System; using S ...

  3. 定位CoreLocation

    一.定位 iOS三种定位方式: CoreLocation 按定位的准确性: GPS(Global Positioning System全球定位系统); 蜂窝式基站; wifi; 定位顺序:1. 首选G ...

  4. Swift基础语法-内存管理, 自动引用计数

    1. 工作机制 Swift和OC一样,采用自动引用计数来管理内存 当有一个强引用指向某一个对象时,该对象的引用计数会自动+1 当该强引用消失时,引用计数会自动-1 当引用计数为0时,该对象会被销毁 2 ...

  5. HTML5中表单元素的formaction属性

    在submit按钮中,根据不同的submit按钮,将表单提交到不同的页面中: <form id="test" action="test.jsp"> ...

  6. mysql数据库常用语句2

    关于mysql常用语句的整理,上一篇涉及到ddl.dml以及一些简单的查询语句. 1:mysql分页查询 select * from table_name limit 5,10;   从下标为5元素查 ...

  7. Linux 的使用基础---Linux的常用命令

    自己电脑的安装的软件太多了,如果重装linux系统的话,是在是太麻烦了,本身电脑系统是32位的,硬件上的配置也行,所以就安装了虚拟机,在虚拟机上又安装了一个Linuxd 系统,虽然速度是有些慢,总比浪 ...

  8. 基于Selenium2+Java的UI自动化(1) - 原理和环境搭建

    一.Selenium2的原理 Selenium1是thoughtworks公司的一个产品经理,为了解决重复烦躁的验收工作,写的一个自动化测试工具,其原理是用JS注入的方 式来模拟人工的操作,但是由于J ...

  9. [记录] web icon 字体

    weloveiconfonts  在http://codepen.io/cguillou/pen/jmkfK 中看css发现既然有这样的,yes!

  10. JNDI初认识

    JNDI即Java命名和目录接口,英文全称为Java Naming and Directory Interface,从字面上似乎十分晦涩,下面从理论和实际项目应用方面来阐述. 1.命名:在我们实际生活 ...