使用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对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
随机推荐
- .NET基础 (19)多线程
多线程编程的基本概念1 请解释操作系统层面上的线程和进程2 多线程程序在操作系统里是并行执行的吗3 什么是纤程 .NET中的多线程1 如何在.NET程序中手动控制多个线程2 如何使用.NET的线程池3 ...
- 通过 cygwin64 自己编译对应的 Tera Term cyglaunch.exe
步骤如下: 将 cygterm+.tar.gz解压到任意目录,当然要cygwin容易操作.(本例直接放到$HOME目录下,启动cygwin后的默认目录,如果之前没有更改的话) 将 Makefile 中 ...
- solr-4.10.2版本使用tomcat7部署
当前版本仅限于solr-4.10.2版本.默认环境使用的是jdk1.7,tomcat7.环境自己配置.网上一堆堆的. 1.下载相应的文件(solr-4.10.2.zip). 官网地址:http://l ...
- [javascript][翻译]使用javascript添加css rule
来杭一周,收获很多,成长很多. 周六在搞一个插件的时候碰到需要动态添加伪元素的需求,搜了一下解决方案,有人用正则写出了读取伪元素的函数:我觉得倒是可以通过注入css rule的方式,来让预留有某些类的 ...
- oracle 11gr2 2.04 em 更改 hostname 后无需重建资料库的方法
1) 备份删除$ORACKE_HOME/ xxxx-sid 的EM目录:复制要创建的xxx-sid EM 名称目录: 备份删除$ORACKE_HOME/oc4j/j2ee/ xxxx-sid 的EM目 ...
- yum初识
yum仓库中的元数据文件: primary.xml.gz 所有RPM包的列表: 依赖关系: 每个RPM安装生成的文件列表: filelists.xml.gz 当前仓库中所有RPM包的所有文件列表: o ...
- xml写入
XmlDocument xmlDocument=new XmlDocument(); XmlElement root = xmlDocument.CreateElement("", ...
- JaveScript初学-基础语法
一.JavaScript数据类型 JavaScript中,一切皆对象. JavaScript拥有动态类型,使用var关键字(也可以不必)进行声明——字符串.数字.布尔.对象.Null.Undefine ...
- indows 2008 r2/做了SPS2007---2013后,发现添加原来域中的域组添加不上
根据上次的网络包的分析, 我们在AD中找到了wtc-beijing-it的组, 不过在SharePoint日志中我们没有发现搜索成功的记录. - SearchResultEntry: CN=WTC-B ...
- SQL语句优化 (一) (52)
优化SQL语句的一般步骤 1 通过show status命令了解各种SQL的执行频率. 格式:mysql> show [session|global]status; 其中:session(默认) ...