[NHibernate]HQL查询
目录
写在前面
上篇文章介绍了nhibernate在项目中的基本配置,包括数据库连接字符串的设置,映射文件的配置及需注意的地方,这篇文章将介绍nhibernate的查询方法。
文档与系列文章
[NHibernate]持久化类(Persistent Classes)
[NHibernate]集合类(Collections)映射
[NHibernate]缓存(NHibernate.Caches)
[NHibernate]NHibernate.Tool.hbm2net
[NHibernate]Nhibernate如何映射sqlserver中image字段
查询的几种方式
nhibernate中常见的查询方式有以下三种:
- NHibernate查询语言(HQL,NHibernate Query Language)。
- 条件查询(Criteria API,Query By Example(QBE)是Criteria API的一种特殊情况)。
- 原生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中的查询的是对象的属性。例如
/// <summary>
/// 根据客户姓名进行模糊查询
/// </summary>
/// <param name="strName">查询条件</param>
/// <returns>满足条件的客户信息</returns>
public IList<Customer> SearchByName(string strName)
{
NHibernateHelper nhibernateHelper = new NHibernateHelper();
ISession session = nhibernateHelper.GetSession();
//from后面跟的是持久化类Customer而不是数据表名TB_Customer
return session.CreateQuery("from Customer as customer where customer.CustomerName like '%" + strName + "%'").List<Customer>();
}
在from后面跟的是持久化类的名,而不是表名。否则会出现如下异常:
同样也支持select,查询多个属性时返回的是IList<Object[]> object数组泛型集合。
/// <summary>
/// 根据客户姓名进行模糊查询
/// </summary>
/// <param name="strName">查询条件</param>
/// <returns>满足条件的客户信息</returns>
public IList<object[]> SearchByName(string strName)
{
NHibernateHelper nhibernateHelper = new NHibernateHelper();
ISession session = nhibernateHelper.GetSession();
//from后面跟的是持久化类Customer而不是数据表名TB_Customer
return session.CreateQuery("select customer.CustomerID,customer.CustomerName,customer.CustomerAddress from Customer as customer where customer.CustomerName like '%" + strName + "%'").List<object[]>();
}
当查询单个属性时,例如查询所有客户的id,此时返回IList<Guid>
/// <summary>
/// 获得所有客户的id
/// </summary>
/// <returns></returns>
public IList<Guid> GetAllCustomerID()
{
NHibernateHelper nhibernateHelper = new NHibernateHelper();
ISession session = nhibernateHelper.GetSession();
return session.CreateQuery("select customer.CustomerID from Customer as customer").List<Guid>();
}
另外的order by ,group by,distinct的使用与sql类似,就不再举例子了。
注意:在HQL中,也是大小写不敏感的,也就是不区分大小写的。
一个例子
where条件子句中除sql的大部分情况外,还支持命名参数和位置参数。
根据用户名查询客户信息
/// <summary>
/// 根据姓名查询客户信息
/// </summary>
/// <param name="strName"></param>
/// <returns></returns>
public IList<Customer> GetCustomerByName(string strName)
{
NHibernateHelper nhibernateHelper = new NHibernateHelper();
ISession session = nhibernateHelper.GetSession();
//方式一
// return session.CreateQuery("from Customer c where c.CustomerName='" + strName + "'").List<Customer>();
//方式二:位置型参数
//return session.CreateQuery("from Customer c where c.CustomerName=?")
// .SetString(0, strName)
// .List<Customer>();
//写法3:命名型参数(推荐)
return session.CreateQuery("from Customer c where c.CustomerName=:cn")
.SetString("cn", strName)
.List<Customer>();
}
以上代码,列出了常见的三种风格的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
[NHibernate]HQL查询的更多相关文章
- NHibernate系列文章二十二:NHibernate查询之HQL查询(附程序下载)
摘要 NHibernate提供了多种查询方式,最早的HQL语言查询.Criteria查询和SQL Query,到NHibernate 3.0的Linq NHibernate,NHIbernate 4. ...
- [NHibernate]条件查询Criteria Query
目录 写在前面 文档与系列文章 条件查询 一个例子 总结 写在前面 上篇文章介绍了HQL查询,我个人觉得使用ORM框架就是为了让少些sql,提高开发效率,而再使用HQL就好像还是使用sql,就觉得有点 ...
- 01-05-01-2【Nhibernate (版本3.3.1.4000) 出入江湖】立即加载实现--NHibernateUtil.Initialize()和添加fetch关键字的HQL查询
相关资料: http://www.cnblogs.com/lyj/archive/2008/10/29/1322373.html 问题的提出: 1.延迟加载,可能会引起session已经关闭的异常,例 ...
- 01-04-02【Nhibernate (版本3.3.1.4000) 出入江湖】HQL查询
public IList<Customer> GetAllHql() { IList<Customer> result = null; ISession session = _ ...
- 一步步学习NHibernate(8)——HQL查询(2)
请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,老魏带着大家学习了HQL语句,发现HQL语句还是非常不错的,尤其是在懒加载的时候,书写起来比较的舒服,但是这里老魏 ...
- 一步步学习NHibernate(7)——HQL查询(1)
请注明转载地址:http://www.cnblogs.com/arhat 从本章开始,老魏带着大家来学习一下HQL语句.HQL语句NHibernate为我们提供的一种功能比较强大的查询语句,这个HQL ...
- NHibernate各种查询
NHibernate各种查询 NHibernate's methods of querying are powerful, but there's a learning curve. Longer t ...
- NHibernate 数据查询之Linto to NHibernate (第八篇)
NHibernate 数据查询之Linto to NHibernate (第八篇) 刚学NHibernate的时候觉得,HQL挺好用的,但是终归没有与其他技术 相关联,只有NHibernate用到,一 ...
- Hibernate--------八大类HQL查询集合
Hibernate的 八大类HQL查询集合 Hibernate的八大类HQL查询集合: 一:属性查询(SimplePropertyQuery) 1,单一属性查询 *返回结果集属性列表,元素类型和实 ...
随机推荐
- 编码中的setCharacterEncoding 理解
1.pageEncoding="UTF-8"的作用是设置JSP编译成Servlet时使用的编码. 2.contentType="text/html;charset=UT ...
- CF724D. Dense Subsequence[贪心 字典序!]
D. Dense Subsequence time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- 第23章 java线程通信——生产者/消费者模型案例
第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...
- 嵌入式Linux驱动学习之路(十七)驱动程序分层分离概念-平台设备驱动
平台设备驱动: 包含BUS(总线).DEVICE.DRIVER. DEVICE:硬件相关的代码 DRIVER:比较稳定的代码 BUS有一个driver链表和device链表. ①把device放入bu ...
- WPF Popup 控件导致被遮挡内容不刷新的原因
WPF Popup 控件导致被遮挡内容不刷新的原因 周银辉 今天在写一个WPF控件时用到了Popup控件,很郁闷的情况是:当popup关闭时,原来被popup挡住的界面部分不刷新,非要手动刷新一下(比 ...
- css3伪类温故知新
今天遇到一个问题.要求::after 和 ::before的 content:"content" 能够动态的进行变换,能被JavaScript操作. 百度了下,自己做了实验,发现有 ...
- 基于thrift的微服务框架
前一阵开源过一个基于spring-boot的rest微服务框架,今天再来一篇基于thrift的微服务加框,thrift是啥就不多了,大家自行百度或参考我之前介绍thrift的文章, thrift不仅支 ...
- Android6.0动态申请权限
先直接看代码: public void onClick(View v){ onCallPermission(); } public void onCallPermission(){ if (Build ...
- hibernate的三表查询
表的关系: Cardgraderule 1:n Cardgrade Cardgrade 1:n Acardtype 实体类: public class C ...
- [React] 多组件生命周期转换关系
前段时间一直在基于React做开发,最近得空做一些总结,防止以后踩坑. 言归正传,React生命周期是React组件运行的基础,本文主要是归纳多组件平行.嵌套时,生命周期转换关系. 生命周期 Reac ...