请注明转载地址:http://www.cnblogs.com/arhat

从本章开始,老魏带着大家来学习一下HQL语句。HQL语句NHibernate为我们提供的一种功能比较强大的查询语句,这个HQL语句和我们平时所用的SQL语句基本上是类似的,只不过有个别的地方需要们注意一下。

好,下面我们看一下如何来学习HQL语句,首先老魏得介绍一个对象IQuery,这个对象是用来进行查询操作。那么这个对象又ISession提供的CreateQuery()方法来创建。首先呢,我们在主程序中先写两个示例程序,然后根据这个示例程序来更改我们的NHibernateHelper这个工具类。

首先,我们来使用HQL语句来实现我们前面的查询,查询出所有的Student对象。更改主程序代码如下:

static void Main(string[] args)

        {

//定义一个HQL语句

string hql = "from Student";

//创建一个IQuery对象

            NHibernate.IQuery query = DAL.NHibernateHelper.GetCurrentSession().CreateQuery(hql);

//执行IQuery对象,并把结果取出来

IList<Model.Student> list = query.List<Model.Student>();

foreach (Model.Student student in list)

            {

Console.WriteLine(student.SName + "," + student.SSex + "," + student.SBirthday + "," + student.SId);

            }

        }

我们来看看执行结果:

好,现在我们来分一下这个HQL语句和普通的SQL语句之间的区别,从上面的例子中我们可以知道这个HQL语句以from语句开头,并没有出现select,这是因为我们查询的是Student的所有属性。所以得出下面的结论:

1,如果查询的是所有属性,则可以不使用Select

然而,大家会发现from后面的“表名”确实大写的,这里需要注意的是,这里不再是“表名”而是对象名,也就是Model中的Student.cs这类的类名,因为NHibernte查询的是对象而不是表。所以得出第二条结论:

2,查询的不是“表名”而是“类名”

我们使用IQuery对象的List<T>方法,将会把结果转换为我们的对象集合,返回的是IList<T>类型。所以我们得出第三个结论:

3,查询结果一般为IList<T>类型。

现在,我们要查询Student对象中的姓名和性别。如果使用Get或者Load方法的话,的确会查询出来,但是随着也查询出了我们不需要的字段。现在我们只想要姓名和性别。那么此时就应该使用HQL语句了。代码如下:

//定义一个HQL语句

string hql = "select SName,SSex from Student";

//创建一个IQuery对象

            NHibernate.IQuery query = DAL.NHibernateHelper.GetCurrentSession().CreateQuery(hql);

//执行IQuery对象,并把结果取出来

IList<object[]> list = query.List<object[]>();

foreach (object[] objs in list)

            {

foreach (object obj in objs)

                {

Console.WriteLine(obj);

                }

            }

下面则是查询结果:

由于,我们现在只需要两个属性,所以前面的select还是要带上的。同是需要注意的是,这里查询的不是表的“字段名”而是对象的“属性名”,也就是“SName,SSex”是Student对象的属性名。所以我们得出第4条结论。

4,如果查询个别字段,则应该使用对象的”属性名“而不是表的“字段名”

同时,由于我们查询出的只是个别字段,所以我们不能用对象来接受查询的结果,因为NHibernate只有在查询的是全属性的时候,在会返回一个对象,如果只是个别字段,则返回的是object或object[]对象。如果查询的属性名个数大于1,则返回的是object[],如果只有一个则返回object。所以我们得出第5个结论。

5,查询个别字段时,应使用object(一个属性)或object[](多个属性)来接受返回的结果。

下面,我们来查询一个字段,比如只取出学生的姓名。

static void Main(string[] args)

        {

//定义一个HQL语句

string hql = "select SName from Student";

//创建一个IQuery对象

            NHibernate.IQuery query = DAL.NHibernateHelper.GetCurrentSession().CreateQuery(hql);

//执行IQuery对象,并把结果取出来

IList<string> list = query.List<string>();

foreach (string  name in list)

            {                

Console.WriteLine(name);               

            }

        }

为了减少装箱和拆箱操作,这里老魏使用了泛型,当然了你可以使用object(这个是万能的主啊,嘻嘻)。

现在,老魏的要求又变了,现在我们要查询性别为男的学生。看到这样的要求很容易的就想到了使用where语句,那么我们看看怎么使用where语句。

static void Main(string[] args)

        {

//定义一个HQL语句

string hql = "from Student where SSex='男'";

//创建一个IQuery对象

            NHibernate.IQuery query = DAL.NHibernateHelper.GetCurrentSession().CreateQuery(hql);

//执行IQuery对象,并把结果取出来

IList<Model.Student> list = query.List<Model.Student>();

foreach (Model.Student student in list)

            {

Console.WriteLine("姓名:"+student.SName+",性别:"+student.SSex);               

            }

        }

需要注意的是where条件后面的”字段名“也必须是对象的”属性名”。虽然这样达到我们的要求,但是从安全性上来说不好,因为容易SQL注入。如果能像ADO.NET那样使用setParameter多好啊,幸运的是NHibernate提供了这样的方法。下面我们来改写一下。

static void Main(string[] args)

        {

//定义一个HQL语句

string hql = "from Student where SSex=?";

//创建一个IQuery对象

            NHibernate.IQuery query = DAL.NHibernateHelper.GetCurrentSession().CreateQuery(hql);

            query.SetParameter(, "男");

//执行IQuery对象,并把结果取出来

IList<Model.Student> list = query.List<Model.Student>();

foreach (Model.Student student in list)

            {

Console.WriteLine("姓名:"+student.SName+",性别:"+student.SSex);               

            }

        }

大家注意观察上面生成的SQL语句和这个生成的SQL语句是不同的,因为这个避免了SQL注入。大家需要注意的SetParameter的参数有两个(int position,object value)。而在HQL中使用”?”来作为占位符。当然NHibernate也提供了通过名字的方式,这个大家可以从帮助文档中来学习。

至于其他的,order by,like,between ... and等和聚合函数,老魏将在下面的章节中继续给大家来演示。希望大家能够在空余的时间中多多练习一下HQL语句,因为这个很重要,需要大家转换的一个观点就是HQL语句查询的是对象,这一点尤其重要。还有,在使用HQL查询对象和属性的时候,对象名和属性名是区分大小写的。

一步步学习NHibernate(7)——HQL查询(1)的更多相关文章

  1. 一步步学习NHibernate(8)——HQL查询(2)

    请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,老魏带着大家学习了HQL语句,发现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. Fixflow引擎解析(一)(介绍) - Fixflow开源流程引擎介绍

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  2. oracle 事务简介,锁的概念,java访问数据库注意事项

    java链接oracle和连接其他数据库一样有两种方式:1 桥接 jdbc-obdc2 jbdc insert语句一次插入大量数据 insert into table (列1,列2,列3) selec ...

  3. Android_Handler

    xml文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ...

  4. Linux修改 DNS

    前不久服务器上遇到一些问题,需要修改服务器的dns配置,写下来记下,笔者使用的说centos 6.5. DNS的配置文件在/etc/resolv.conf,但一般情况下修改后重启服务 service ...

  5. Android打包失败Proguard returned with error code 1. See console

    问题一: [2013-06-28 11:12:10 - ] Proguard returned with error code 1. See console [2013-06-28 11:12:10 ...

  6. B/S的验证控件

    验证控件 首先设置一下框架,设置为.net framework 4.0,在4.5下貌似会报错,设置方法为项目上右键/属性页/找到左侧菜单栏里的生成/将框架版本改为4.0. 一.非空验证:Require ...

  7. 类名.class与类名.this详解

    类名.class      我们知道在java中,一个类在被加载的时候虚拟机就会自动的生成一个这个类的一个Class类型的“类对象”,每个类都对应着一个这样的类对象,通过这个Class类型的类对象,我 ...

  8. 项目中 mysql中的内容关于上架时间和下架时间

    隐藏左边导航 在mysql中,是存放的10位的时间截,在后台添加时,时间的格式是:'Y-m-d H:i',没有秒的 字段 字段名称 字段类型 是否为空 默认值 备注 publish_up int(11 ...

  9. 页面javascript 和jquery 的一些用法

    confirm:提交之前的提示验证 if(confirm("确认是否提交?")){ alert("确认提交..."); } input按钮的禁用: $(&quo ...

  10. hibernate--could not initialize proxy - no Session--懒加载问题

    今天在学习hibernate时,出现了以下错误: 错误分析: 如果我们取单个对象可以用get方法没有问题:但是如果我们取的的对象还有关联对象时用get就有问题,因为它不会把关联的对象取出来 参考博客: ...