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特有的面向对象查询语言,他具有继承、多态的特点。很像原生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查询(附程序下载)的更多相关文章
- WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]
原文:WCF技术剖析之二十八:自己动手获取元数据[附源代码下载] 元数据的发布方式决定了元数据的获取行为,WCF服务元数据架构体系通过ServiceMetadataBehavior实现了基于WS-ME ...
- Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】
<Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...
- FreeSql (二十二)Dto 映射查询
适合喜欢使用 dto 的朋友,很多时候 entity 与 dto 属性名相同,属性数据又不完全一致. 有的人先查回所有字段数据,再使用 AutoMapper 映射. 我们的功能是先映射,再只查询映射好 ...
- Spring Boot干货系列:(十二)Spring Boot使用单元测试(转)
前言这次来介绍下Spring Boot中对单元测试的整合使用,本篇会通过以下4点来介绍,基本满足日常需求 Service层单元测试 Controller层单元测试 新断言assertThat使用 单元 ...
- NHibernate系列文章一:NHibernate介绍
摘要 NHibernate是一个成熟的开源的面向对象的.net映射框架.大量的实际项目中正在使用该框架.他是建立在ADO.Net基础之上.目前的版本是NHibernate 4.0.4.本系列文章都是基 ...
- SQL注入之Sqli-labs系列第二十一关(基于复杂性的cookie POST报错注入)和二十二关(基于双引号的cookie POST报错注入)
开始挑战第二十一关(Cookie Injection- Error Based- complex - string) 和二十二关(Cookie Injection- Error Based- Doub ...
- NHibernate系列文章目录
第一章:NHibernate基础 NHibernate介绍 第一个NHibernate工程 简单的增删改查询 运行时监控 NHibernate配置 数据类型映射 Get/Load方法 NHiberna ...
- Bootstrap <基础二十二>超大屏幕(Jumbotron)
Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...
- 剑指Offer(二十二):从上往下打印二叉树
剑指Offer(二十二):从上往下打印二叉树 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...
- 使用Typescript重构axios(二十二)——请求取消功能:收尾
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
随机推荐
- JavaScript 的循环语句语法摘要
if条件语句语法: if(condition){ statements; } 理解:圆括号里的是条件参数 ,花括号里的为执行的语句. 示例代码:if(1>2){ alert("Th ...
- ueditor调用其中的附件上传功能
ueditor实际上是集成了webuploader, 在做内容发布的时候想既有ueditor又有单独的附件上传按钮,这时再加载一个webuploader就显得过于臃肿了,单独利用ueditor的上传功 ...
- netty研究【1】:编译源代码
netty作为异步通信底层框架,其优异的性能让我产生了研究他的源码的决定. 代码研究之前,第一步就是要准备环境,至少可以编译通过,下面,就拿github上的4.1分支进行.我的IDE是Intellij ...
- gRaphael——JavaScript 矢量图表库:两行代码实现精美图表
gRaphael 是一个致力于帮助开发人员在网页中绘制各种精美图表的 Javascript 库,基于强大的 Raphael 矢量图形库.你只需要编写几行简单的代码就能创建出精美的条形图.饼图.点图和曲 ...
- IOS零碎技术整理(2)-隐藏系统Tabbar
原理就是将tabbar移出显示区 -(void)hideSystemTabBar:(UITabBar*) tabbarcontroller { [UIView beginAnimations:nil ...
- MongoDB的下载与安装
MongoDB的下载与安装 一.简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案.MongoDB 是一个介于关系 ...
- 每天一个 Linux 命令(18):locate 命令
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案.其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了.在一般的 di ...
- XE7 & IOS开发之开发账号(1):开发证书、AppID、设备、开发授权profile的申请使用,附Debug真机调试演示(XCode所有版本通用,有图有真相)
网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 注意,以下讨论都是以&q ...
- Pycharm注册码(2016.2)
43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...
- FreeBSD从零开始---安装后配置(三)
IPFW和IPF 一.IPFW IPFW意思可以理解为ip防火墙,主要作用是拦截设定规则外的ip包.你可以把这个理解为linux下的iptables,但是,ipfw要比iptables简单易用. ...