使用NHibernate(6)-- HQL && ICriteria 简单介绍
1,HQL。
HQL是NHibernate特有的查询方式,早先的java语法还没有类似Linq的Jinq,所以Hibernate就弄了一套自己的查询语言,NHibernate移植的时候把这种语言也一块儿移植过来了。这是一种和Sql差不多的语言,不同的是查询中的字段和实体名保持一致,而不是和数据库表列名保持一致。
下面的例子还是在之前那个小程序的基础上演示:
public User GetUserByName(string name)
{
var hql = @"select u from User u where u.Name=:name ";
return session.CreateQuery(hql).SetString("name",name);
}
这个示例从NH_User表中查找出指定名称的User。可以看到我们的hql语言中写的是User,而不是NH_User。另外,因为此处要查询的是一整个实体,所以可以简写成“from User u where u.Name=:name”。最后通过Session的CreateQuery方法创建一个查询,并给参数赋值。
类似的还支持 inner join,where,order by,group by,and or,delete,甚至是sql中的聚合函数sum等。
在来个批量删除的例子:
Session.CreateQuery("delete from User where Id> :Id")
.SetInt64("Id", id)
.ExecuteUpdate();
以下截图来自《Working with NHibernate 3.0》

2,ICriteria。
ICriteria是NHibernate标准查询接口。
先看一段原始的ICriteria查询:
ICriteria criteria = Session.CreateCriteria<User>(“u”)
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property(“u.Id”))
.Add(Projections.Property(“u.Name”));
对应的sql语句如下:
select u.Id,u.Name from User u
从上面的查询可以看出ICriterria用起来是非常麻烦的,于是NHibernate3.0之后对ICriteria进行了扩展,添加了QueryOver方法,使用起来和linq+lambda的方式差不多。下面是使用QueryOver方法的示例:
Session.QueryOver<User>().where(u=>u.Id>3).OrderBy(u=>u.Name).List();
类似where方法,还支持Inner.JoinQueryOver<T>、SingleOrDefault等和linq非常相似的方法。
下图来自《Working with NHibernate3.0》

3,另外还有综合查询(MultiQuery)和命名查询(Name Queries),不常用,所以不打算介绍。
Futures查询在上一篇linq to Nhibernate中已经介绍,HQL和ICriteria中也有相同的使用方法。
使用NHibernate(6)-- HQL && ICriteria 简单介绍的更多相关文章
- HQL语句简单介绍
HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此 Hib ...
- NHibernate初学二之简单执行SQL及HQL、Linq
上篇文章简单介绍NHibernate之简单增删改查,本文将会简单介绍有关执行NHibernate的SQL.HQL及存储过程: 一:执行SQL语句实例,运用CreateSQLQuery方法 public ...
- [转]NHibernate之旅(3):探索查询之NHibernate查询语言(HQL)
本节内容 NHibernate中的查询方法 NHibernate查询语言(HQL) 1.from子句 2.select子句 3.where子句 4.order by子句 5.group by子句 实例 ...
- hibernate 教程(3)—NHibernate查询语言HQL
NHibernate之旅(3):探索查询之NHibernate查询语言(HQL) 本节内容 NHibernate中的查询方法 NHibernate查询语言(HQL) 1.from子句 2.select ...
- Hibernate学习(1)简单介绍
1.什么是Hibernate? 首先,Hibernate是数据持久层的一个轻量级框架.数据持久层的框架有非常多比方:iBATIS,myBatis,Nhibernate,Siena等 ...
- NHibernate之旅(3):探索查询之NHibernate查询语言(HQL)
本节内容 NHibernate中的查询方法 NHibernate查询语言(HQL) 1.from子句 2.select子句 3.where子句 4.order by子句 5.group by子句 实例 ...
- SQLite数据库和JPA简单介绍
SQLite数据库和JPA简单介绍 一.SQLite简单使用 SQLite是遵循ACID的关系数据库管理系统,它的处理速度很快,它的设计目标是嵌入式的,只需要几百K的内存就可以了. 1.下载SQLit ...
- 简单介绍几种Java后台开发常用框架组合
01 前言 Java框架一直以来都是面试必备的知识点,而掌握Java框架,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能对当前正在开发中的系统有整体的认知,从而更好的熟悉和学习技术,这篇 ...
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
随机推荐
- linux每天一小步---touch命令详解
1 命令功能: 创建文件和修改文件或者目录的时间戳 2 命令语法: touch [选项] [文件名或者目录名] 3 命令参数: -a 只修改文件的access(访问)时间. -c 或-- ...
- [转]程序集之GAC---Global Assembly Cache
本文转自:http://www.cnblogs.com/jhxk/articles/2564295.html 1.什么是GAC?GAC解决什么问题? GAC全称为: Global Assembly C ...
- java经典开发模式
Java Web开发方案有多种可供选择,这里列举一些经典的开发模式进行横向比较,为Java Web的开发模式选择提供参考.除此之外还有好多方案(如Tapestry和Wicket等等)并不了解,这里就不 ...
- 13、容器之间的link
很多时候我们的业务分为前台和后台,例如:"前台的代码需要连接数据库进行数据操作":但是在写代码的时候我们并不知道后台数据库的地址是什么,所以我们可以docker通过固定的名字来 ...
- nancyfx的安装笔记
这个安装时很简单的 只要 Install-Package Nancy.Hosting.Aspnet 就行了. 需要注意的是,千万不要用那个模板安装,通过创建nancyfx类型项目的方式安装是有问题的. ...
- sqlcmd 执行SQL语句或没有足够的内存来执行脚本
win+r命令提示框里面输入cmd sqlcmd -S . -U username -P password -d database -i url -S 数据库地址 -U 登录名称 -P 密码 -d 数 ...
- python 单线程实现并发
单线程下支持并发(服务端): from gevent import spawn,monkey;monkey.patch_all() from socket import * def server(ip ...
- django系列3.4-- request对象和response对象(未完待续)
一.request对象 详细信息可以查阅django官方文档 共有五种请求相关的常用值 request.path_info 返回用户访问的url不包括域名 request.method 请求中使用的H ...
- POJ的练习题
http://wenku.baidu.com/link?url=PT1gkBWC3eXuzzs0QqWklC0VNYkf5ynxBFguXPGYR22l1D2tXmQ4VjnsWvbFyvj1fqGi ...
- ClamAV学习【7】——病毒库文件格式学习
搜查到一份详细的ClamAV病毒文件格式资料(http://download.csdn.net/detail/betabin/4215909),英文版,国内这资料不多的感觉. 重点看了下有关PE的病毒 ...