摘要

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

下面以前面几篇文章介绍的一对多、多对多对象模型为基础,介绍HQL。

本篇文章的代码可以到NHibernate查询下载

1、from子句

from子句很简单,他的格式是

from 实体类类名

查询Customer类所有实体对象:

         public IList<Customer> QueryAllHql()
{
return Session.CreateQuery("from Customer").List<Customer>();
}

from子句不支持符号“*”。

通过ISession的CreateQuery方法,传入HQL语句,生成IQuery对象,然后调用List方法立即执行查询。

2、as子句提供别名,as可以省略

         public IList<Customer> QueryAllHql()
{
return Session.CreateQuery("from Customer as c").List<Customer>();
}

3、select子句

指定列返回数组

         public IList<int> SelectIdHql()
{
return Session.CreateQuery("select distinct c.Id from Customer c").List<int>();
}

4、where子句

where子句跟SQL基本相同

         public IList<Customer> GetCustomerByNameHql(string firstName, string lastName)
{
return Session.CreateQuery("from Customer c where c.FirstName = :firstName and c.LastName = :lastName")
.SetString("firstName", firstName).SetString("lastName", lastName).List<Customer>();
}
  • 这里使用命名参数列表的形式,命名参数的格式是以符号":"开始的变量名,使用Set后面带参数类型的方法名对命名参数赋值。
  • 也可以拼接字符串,可能会引起SQL注入,不推荐使用。
  • 你还可以使用序号参数形式,序号参数使用符号"?"作为通配符,使用Set方法的重载方法,第一个参数类型是int,表示参数序号,第二个参数是参数值。

另一个例子,使用like模糊查询。

         public IList<Customer> GetCustomersStartWithHql()
{
var list = Session.CreateQuery("from Customer c where c.FirstName like 'J%'").List<Customer>();
return list;
}

where子句支持SQL大部分的条件查询语句,包括and、or、=、!=、<、>、标量函数等。

5、order by子句

         public IList<Customer> GetCustomersOrderByHql()
{
return Session.CreateQuery("from Customer c order by c.FirstName").List<Customer>();
}

6、关联查询

注意一点,关联查询的语句面向的是对象,因此可以直接在查询语句里使用对象的对象属性,比如c.Orders集合。

         /// <summary>
/// 按分组查询客户Id及客户关联的订单数量
/// </summary>
/// <returns></returns>
public IList<object[]> SelectOrderCountHql()
{
return Session.CreateQuery("select c.Id, c.Orders.size from Customer c").List<object[]>();
} /// <summary>
/// 查询所有订单数量大于2的客户信息
/// </summary>
/// <returns></returns>
public IList<Customer> GetCustomersOrderCountGreaterThanHql()
{
var list = Session.CreateQuery("from Customer c where c.Orders.size > 2").List<Customer>();
return list;
} /// <summary>
/// 查询在指定日期到当前时间内有下订单的客户信息
/// </summary>
/// <param name="orderDate"></param>
/// <returns></returns>
public IList<Customer> GetCustomersOrderDateGreatThanHql(DateTime orderDate)
{
var list = Session.CreateQuery("select distinct c from Customer c inner join c.Orders o where o.Ordered > :orderDate")
.SetDateTime("orderDate", orderDate).List<Customer>();
return list;
}

7、NHibernate的IQuery接口提供方法ExecuteUpdate执行批量修改

Session.CreateQuery("Insert/Update/Delete语句").ExecuteUpdate();

结语

NHibernate HQL查询的优点是很像原生SQL语言,很容易掌握。而且写起来比较灵活,能够满足绝大部分的查询任务。缺点也是显而易见的,将查询条件写在字符串里,不容易在编译时发现问题。最后介绍了通过IQuery接口ExecuteUpdate方法执行批量数据的更新。

NHibernate系列文章二十二:NHibernate查询之HQL查询(附程序下载)的更多相关文章

  1. WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]

    原文:WCF技术剖析之二十八:自己动手获取元数据[附源代码下载] 元数据的发布方式决定了元数据的获取行为,WCF服务元数据架构体系通过ServiceMetadataBehavior实现了基于WS-ME ...

  2. Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】

    <Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...

  3. FreeSql (二十二)Dto 映射查询

    适合喜欢使用 dto 的朋友,很多时候 entity 与 dto 属性名相同,属性数据又不完全一致. 有的人先查回所有字段数据,再使用 AutoMapper 映射. 我们的功能是先映射,再只查询映射好 ...

  4. Spring Boot干货系列:(十二)Spring Boot使用单元测试(转)

    前言这次来介绍下Spring Boot中对单元测试的整合使用,本篇会通过以下4点来介绍,基本满足日常需求 Service层单元测试 Controller层单元测试 新断言assertThat使用 单元 ...

  5. NHibernate系列文章一:NHibernate介绍

    摘要 NHibernate是一个成熟的开源的面向对象的.net映射框架.大量的实际项目中正在使用该框架.他是建立在ADO.Net基础之上.目前的版本是NHibernate 4.0.4.本系列文章都是基 ...

  6. SQL注入之Sqli-labs系列第二十一关(基于复杂性的cookie POST报错注入)和二十二关(基于双引号的cookie POST报错注入)

    开始挑战第二十一关(Cookie Injection- Error Based- complex - string) 和二十二关(Cookie Injection- Error Based- Doub ...

  7. NHibernate系列文章目录

    第一章:NHibernate基础 NHibernate介绍 第一个NHibernate工程 简单的增删改查询 运行时监控 NHibernate配置 数据类型映射 Get/Load方法 NHiberna ...

  8. Bootstrap <基础二十二>超大屏幕(Jumbotron)

    Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...

  9. 剑指Offer(二十二):从上往下打印二叉树

    剑指Offer(二十二):从上往下打印二叉树 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...

  10. 使用Typescript重构axios(二十二)——请求取消功能:收尾

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

随机推荐

  1. python raw String 获取字符串变量中的反斜杠

    常用的获取raw string的方式为: >>>r'\n' \n 不能用在字符串变量中,获取字符串变量中的反斜杠如下: tab = '\n' >>>tab.enco ...

  2. 如何用ABBYY FineReader识别图片中的文本

    ABBYY FineReader 12是一款OCR光学字符识别软件,能够快速方便地将扫描纸质文档.PDF文件和数码相机的图像转换成可编辑.可搜索的文本,让电脑处理更具效率,摆脱从前的烦恼,告别耗时费力 ...

  3. virtio-blk简介[转]

    声明: 本博客欢迎转发,但请保留原作者信息!新浪微博:@孔令贤HW: 博客地址:http://lingxiankong.github.io/内容系本人学习.研究和总结,如有雷同,实属荣幸! virti ...

  4. Centos6---Fail2ban

    1.安装: rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm yum -y install ...

  5. IIS性能相关的配置、命令

    IIS性能相关的配置.命令 应用程序池回收 不要使用缺省的“固定时间间隔(分钟)”:1740(即29小时),建议改为0 可以根据实际情况设置特定时间回收,比如凌晨4点 最大工作进程数 可以根据实际情况 ...

  6. 《舌尖上的中国》第二季今日首播了,天猫食品也跟着首发,借力使力[bubuko.com]

    天猫旗下的天猫食品与央视CCTV-1栏目<舌尖上的中国>第二季(以下简称“舌尖2”)达成合作,天猫食品成为舌尖2独家合作平台,同步首发每期 节目中的食材和美食菜谱,舌尖2摄制组还将为同步上 ...

  7. 承接Unity3D外包公司 — 技术分享

    Cardboard SDK for Unity的使用 上一篇文章作为系列的开篇,主要是讲了一些虚拟现实的技术和原理,本篇就会带领大家去看一看谷歌的Cardboard SDK for Unity,虽然目 ...

  8. MyBatis原理分析之四:一次SQL查询的源码分析

    上回我们讲到Mybatis加载相关的配置文件进行初始化,这回我们讲一下一次SQL查询怎么进行的. 准备工作 Mybatis完成一次SQL查询需要使用的代码如下: ) { ); ) { throw ne ...

  9. tokudb引擎磁盘空间不足导致写入失败的调查

    故障现象 2016.1.1号早上4点左右,zabbi数据库服务器报警,写入数据失败.登陆机器后检查发现磁盘空间使用95%没有用满,进去zabbix数据库,执行insert命令提示错误“errir 10 ...

  10. [Doxygen]Doxygen

    1. Doxygen做什么? 首先这是一个文档生成工具,而不是代码中的注释生成工具.其次,如何生成对应文档,那就是按照一个配置文件中给出的配置格式来书写注释的时候,通过工具就可以解析代码注释最终生成文 ...