[NHibernate]HQL查询

目录

写在前面

文档与系列文章

查询的几种方式

HQL查询

一个例子

总结

写在前面

上篇文章介绍了nhibernate在项目中的基本配置,包括数据库连接字符串的设置,映射文件的配置及需注意的地方,这篇文章将介绍nhibernate的查询方法。

文档与系列文章

[Nhibernate]体系结构

[NHibernate]ISessionFactory配置

[NHibernate]持久化类(Persistent Classes)

[NHibernate]O/R Mapping基础

[NHibernate]集合类(Collections)映射 

[NHibernate]关联映射

[NHibernate]Parent/Child

[NHibernate]缓存(NHibernate.Caches)

[NHibernate]NHibernate.Tool.hbm2net

[NHibernate]Nullables

[NHibernate]Nhibernate如何映射sqlserver中image字段

[NHibernate]基本配置与测试 

查询的几种方式

nhibernate中常见的查询方式有以下三种:

  1. NHibernate查询语言(HQL,NHibernate Query Language)。
  2. 条件查询(Criteria API,Query By Example(QBE)是Criteria API的一种特殊情况)。
  3. 原生SQL(Literal SQL,T-SQL、PL/SQL)。

HQL查询

这篇文章着重介绍HQL查询方式。

HQL(Hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。

完整的HQL语句形式如下:

Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc

其中的update/delete为Hibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL查询。(来自百度百科)

注意:HQL是基于面向对象的查询语言。

该怎样理解这就话呢?和sql不同,HQL中的查询的是对象的属性。例如

 1         /// <summary>
 2         /// 根据客户姓名进行模糊查询
 3         /// </summary>
 4         /// <param name="strName">查询条件</param>
 5         /// <returns>满足条件的客户信息</returns>
 6         public IList<Customer> SearchByName(string strName)
 7         {
 8             NHibernateHelper nhibernateHelper = new NHibernateHelper();
 9             ISession session = nhibernateHelper.GetSession();
10             //from后面跟的是持久化类Customer而不是数据表名TB_Customer
11             return session.CreateQuery("from Customer as customer where customer.CustomerName like ‘%" + strName + "%‘").List<Customer>();
12         }

在from后面跟的是持久化类的名,而不是表名。否则会出现如下异常:

同样也支持select,查询多个属性时返回的是IList<Object[]> object数组泛型集合。

 1         /// <summary>
 2         /// 根据客户姓名进行模糊查询
 3         /// </summary>
 4         /// <param name="strName">查询条件</param>
 5         /// <returns>满足条件的客户信息</returns>
 6         public IList<object[]> SearchByName(string strName)
 7         {
 8             NHibernateHelper nhibernateHelper = new NHibernateHelper();
 9             ISession session = nhibernateHelper.GetSession();
10             //from后面跟的是持久化类Customer而不是数据表名TB_Customer
11             return session.CreateQuery("select customer.CustomerID,customer.CustomerName,customer.CustomerAddress from Customer as customer where customer.CustomerName like ‘%" + strName + "%‘").List<object[]>();
12         }

当查询单个属性时,例如查询所有客户的id,此时返回IList<Guid>

 1         /// <summary>
 2         /// 获得所有客户的id
 3         /// </summary>
 4         /// <returns></returns>
 5         public IList<Guid> GetAllCustomerID()
 6         {
 7             NHibernateHelper nhibernateHelper = new NHibernateHelper();
 8             ISession session = nhibernateHelper.GetSession();
 9             return session.CreateQuery("select customer.CustomerID from Customer as customer").List<Guid>();
10         }

另外的order by ,group by,distinct的使用与sql类似,就不再举例子了。
注意:在HQL中,也是大小写不敏感的,也就是不区分大小写的。

一个例子

where条件子句中除sql的大部分情况外,还支持命名参数和位置参数。
根据用户名查询客户信息

 1         /// <summary>
 2         /// 根据姓名查询客户信息
 3         /// </summary>
 4         /// <param name="strName"></param>
 5         /// <returns></returns>
 6         public IList<Customer> GetCustomerByName(string strName)
 7         {
 8             NHibernateHelper nhibernateHelper = new NHibernateHelper();
 9             ISession session = nhibernateHelper.GetSession();
10             //方式一
11             // return session.CreateQuery("from Customer c where c.CustomerName=‘" + strName + "‘").List<Customer>();
12             //方式二:位置型参数
13             //return session.CreateQuery("from Customer c where c.CustomerName=?")
14             //    .SetString(0, strName)
15             //     .List<Customer>();
16             //写法3:命名型参数(推荐)
17             return session.CreateQuery("from Customer c where c.CustomerName=:cn")
18                 .SetString("cn", strName)
19                 .List<Customer>();
20         }

以上代码,列出了常见的三种风格的HQL语句写法。
方式一:类似ADO.NET中的一般查询语句的写法,此种写法可能造成SQL注入,不建议使用。

方式二:ADO.NET风格的?参数,NHibernate的参数从0开始计数。

方式三:命名参数用:name的形式在查询字符串中表示,这时IQuery接口把实际参数绑定到命名参数。(类似ADO.NET中参数化查询,推荐这种查询方式)。

我们监控一下方式三生成的sql语句:

通过上图我们发现,在生成的sql中,查询条件为:

customer0_.CustomerName=@p0‘,N‘@p0 nvarchar(4000)‘,@p0=N‘wolfy‘

@p0参数,再执行存储过程,将实参wolfy字符串赋给参数@p0了。

总结

HQL查询是基于面向对象的,在使用查询是from后面的是持久化类对象,而不是数据表表名,这点应该注意。其它的地方跟sql查询比较类似,比如order by ,group by,统计函数的使用等。

在使用hql查询时,推荐使用命名参数的方式查询。

参考文章

http://www.cnblogs.com/lyj/archive/2008/10/15/1312089.html

时间: 2024-08-10 08:02:17

[NHibernate]HQL查询的相关文章

NHibernate系列文章二十二:NHibernate查询之HQL查询(附程序下载)

摘要 NHibernate提供了多种查询方式,最早的HQL语言查询.Criteria查询和SQL Query,到NHibernate 3.0的Linq NHibernate,NHIbernate 4.0又添加了Query Over.每种方式各有优缺点,任何一个SQL查询可以使用任何查询方式查询.根据程序员每种方式掌握的情况,可以使用不同的查询方式.本篇文章介绍HQL语言查询.HQL(Hibernate Query Language)是NHibernate特有的面向对象查询语言,他具有继承.多态的

Hibernate(十二):HQL查询(一)

概述 Hibernate提供了以下几种检索对象的方式 1)导航对象图检索方式:根据已经加载的对象导航到其他对象: 2)OID检索方式:按照对象的OID来检索对象: 3)HQL检索方式:使用面向对象的HQL查询语言: 4)QBC检索方式:使用QBC(Query By Criteria)API来检索对象.这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口. 5)本地SQL检索的方式:使用本地数据的SQL查询语句. HQL(Hibernate Query Language)面向对象

Hibernate HQL查询:

Hibernate HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装.完整的HQL语句形势如下:Select/update/delete…… from …… where …

使用hql查询时的异常:Xxx is not mapped[from Xxx where ...]

今天项目中使用hql查询时,出现    QingAoCenterInfo is not mapped[from QingAoCenterInfo where...] 显然是Hibernate映射关系出现了问题. 出现这种异常首先要查看查询语句中是否使用了数据库表中的表名,而不是实体类. 查看我的代码: centerList = manager.find("from QingAoCenterInfo center where center.type = ? and center.centerNam

转: Hibernate HQL查询 插入 更新(update)实例

1.实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql=”from User user ”;List list=session.CreateQuery(hql).list();上面的代码执行结果是,查询出User实体对象所对应的所有数据,而且将数据封装成User实体对象,并且放入List中返回.这里需要注意的是,Hibernate的实体查询存在着对继承关系的判定,比如我们前面讨论映射实体继承关系中的Employee实体对象,它有两个子类分别是 Hour

Hibernate(十一)HQL查询

HQL:Hibernate Query Language HQL有几个特点: 与SQL相似,SQL中的语法基本上都可以直接使用; SQL查询的是表和表中的列:HQL查询的是对象与对象中的属性; HQL的关键字不区分大小写,类名与属性名区分大小写; select可以省略. package test.hibernate.hbmHQL; import java.util.HashSet; import java.util.Set; public class Department { private I

HQL查询

HQL(Hibernate QueryLanguage) 是面向对象的查询语言,它和SQL查询语言有些相似. 1.Select/update/delete-- from -- where -- group by -- having --order by -- asc/desc 2.select语句 1.查询出来整个映射对象 String hql = "from Users"; Query query = session.createQuery(hql); List<Users&g

HQL查询——查询返回对象类型分析

关于HQL查询,我们可以结合hibernate的API文档,重点围绕org.hibernate.Query接口,分析其方法,此接口的实例对象是通过通过session.对象的creatQuery(String hql)方法得到的.我这里要分析HQL的select子句,当然要想深入HQL查询,我们就必须了解hibernate缓存的知识. 一.选择--Select子句查询返回对象的讨论 为什么只说Select子句,因为我们使用的hibernate框架是基于java语言环境下进行开发的,也就是说hibe

Hibernate六 HQL查询

HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条件查询,甚至使用原生的SQL查询语句.Hibernate还提供了一种数据过滤功能,这些都用于删选目标数据.2.查询步骤:(1)获取Hibernate Session对象(2)编写HQL语句(3)以HQL语句为参数,调用Session的createQuery()方法创建查询对象(4)如果HQL语句包含