一步步学习NHibernate(10)——连接查询和子查询(2)
请注明转载地址:http://www.cnblogs.com/arhat
在上一章中,老魏讲述了HQL的链接查询,本章呢,老魏开始讲述HQL的子查询。子查询在SQL中也是占据着非常重要的作用,如果没有子查询,则有些特殊的需求我们是无法满足的。好了,废话不多说了,开始本章的旅行。
首先NHibenrate对于子查询有着一个非常重要的要求:“HQL中,子查询必须出现在where子句中,并且以一对圆括号包围”。这条规矩希望大家能够牢记在心中。
比如,我们现在要查询出,班级人数大于2的班级名称。那么HQL语句如下:
from Clazz c where c.CId in (selec s.Clazz.CId from Student s group by s.Clazz.CID having count(*)>2)
我们来试着执行一下,代码如下:
static void Main(string[] args)
{
string hql = "from Clazz c where c.CId in (select s.Clazz.CId from Student as s group by cid having count(*)>2)";
Model.Clazz clazz = DAL.NHibernateHelper.CreateQuery(hql, null).UniqueResult<Model.Clazz>();
Console.WriteLine("人数大于2的班级是:"+clazz.CName);
}
运行结果如下:

从结果中,我们得到了我们想要的,同时NHibernate的确生成了子查询。但是NHibernate为HQL语句提供了几个HQL函数,可以帮助我们方便的解决这个问题,我们再把这个HQL语句更改一下:
string hql = "from Clazz as c where size(c.Students)>2";

这里我们会发现,虽然结果相同,但是生成的SQL语句不通,而HQL提供的size()函数是把集合属性作为参数的。当然了,HQL还提供了minelement(), maxelement(), minindex(), maxindex()等函数。
现在我们需要查询年龄为60的学生所在的班级。HQL语句如下:
string hql = "from Clazz as c where 60 in (select s.SAge from Student as s where s.Clazz.CId = c.CId)";
执行结果如下:

从上面的几个例子中,我们了解了HQL语句对自查训的要求,不过,在使用子查询的过程中,我们还使用到了HQL的导航语法,比如where s.Clazz.CId = c.CId。本身在Student对象中没有Cid字段的,但是这里又需要,所以可以使用Student对象对父对象Clazz的引用来得到和Student关联的cid值。从上面的结果可以看出,最终HQL语句使用的还是Student表中的Cid和Clazz表中的CId.
不过话说回来了,HQL的子查询,说实在的老魏在一开始都比较蒙,可能因为习惯了SQL,导致在对对象查询的时候有点不知所措啊。以后还得多多练习。
那么本章就讲到这里了,大家多多练习吧!
一步步学习NHibernate(10)——连接查询和子查询(2)的更多相关文章
- 一步步学习NHibernate(9)——连接查询和子查询(1)
请注明转载地址:http://www.cnblogs.com/arhat 在前几章中,我们把HQL的基本查询学习了一下,但是只有基本查询很显然不能满足我们的需求,那么就需要一下复杂查询比如" ...
- 一步步学习NHibernate(8)——HQL查询(2)
请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,老魏带着大家学习了HQL语句,发现HQL语句还是非常不错的,尤其是在懒加载的时候,书写起来比较的舒服,但是这里老魏 ...
- 从项目上一个子查询扩展学习开来:mysql的查询、子查询及连接查询
上面这样的数据,想要的结果是:如果matchResult为2的话,代表是黑名单.同一个softId,version,pcInfoId的代表是同一个软件,需要去重:同时,如果相同软件里面只要有一个mat ...
- mysql的查询、子查询及连接查询
>>>>>>>>>> 一.mysql查询的五种子句 where(条件查询).having(筛选).group by(分组). ...
- Mysql的查询语句(联合查询、连接查询、子查询等)
Mysql的各个查询语句(联合查询.连接查询.子查询等) 一.联合查询 关键字:union 语法形式 select语句1 union[union选项] select 语句2 union[union选项 ...
- mysql查询、子查询、连接查询
mysql查询.子查询.连接查询 一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.gr ...
- MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习
MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...
- [转]mysql的查询、子查询及连接查询
转自:http://www.cnblogs.com/rollenholt/archive/2012/05/15/2502551.html 一.mysql查询的五种子句 where(条件 ...
- sqlserver查询(子查询,全连接,等值连接,自然连接,左右连,交集,并集,差集)
--部门表 create table dept( deptno int primary key,--部门编号 dname ),--部门名 loc )--地址 ); --雇员表 create table ...
随机推荐
- 探讨PHP页面跳转几种实现技巧
PHP被许多程序员用来开发WEB的首选语言.在实际开发中,网站的各项功能都可以通过PHP语言的编写来满足,比如PHP页面跳转这一方法. 探讨PHP变量解析顺序如何获取提交数据 深入解读PHP运行机制 ...
- 关于Java中的构造方法和set方法()给属性赋值
对于一个类中的成员变量(属性),属性如果都设置成了private类型,那么对外给属性设置了get和set方法 , 那么外部程序中给这些属性设置值,有两种方式. 第一种就是通过set()方法. 第二种就 ...
- Oracle查找被长时间锁定的对象并kill
1.用如下语句查找被锁住的表名.OSclient.Session信息 SELECT B.SID ,B.SERIAL# ,D.SPID OS系统进行号 ...
- saltstack实战4--综合练习1
规范配置管理 实际工作中可能会有现网环境,基线环境,开发环境. 需要使用saltstack统一管理.机器多了,业务多了,可能配置文件存放的会比较乱,因此可以统一管理起来 我们可以再加2个目录,test ...
- 关于mongodb ,redis,memcache
先说我自己用的情况: 最先用的memcache ,用于键值对关系的服务器端缓存,用于存储一些常用的不是很大,但需要快速反应的数据 然后,在另一个地方,要用到redis,然后就去研究了下redis. 一 ...
- 【转】六年软件测试感悟-从博彦到VMware
不知不觉已经从事软件测试六年了,2006毕业到进入外包公司外包给微软做软件测试, 到现在加入著名的外企.六年的时间过得真快. 长期的测试工作也让我对软件测试有了比较深入的认识.但是我至今还是一个底层的 ...
- vs如何新建自己工程的环境变量(局部)和 Windows系统(全局).
来源:http://blog.csdn.net/jtop0/article/details/7574139 在vs2008的Project->Property设置里经常会看到类似$ ...
- 第九篇、微信小程序-button组件
主要属性: 注:button-hover 默认为{background-color: rgba(0, 0, 0, 0.1); opacity: 0.7;} 效果图: ml: <!--默认的but ...
- Php 魔术常量
魔术常量 由于其值在程序运行过程中不允许更改,所以是常量:其值,又是运行环境不同而不现,所以叫魔术. __DIR__ 当前脚本文件的路径 示例: __LINE__ ...
- jvmstat监控jvm内存
1.下载jvmstat-3_0.zip: 2.配置环境变量JVMSTAT_JAVA_HOME为jdk目录E:\Program Files\Java\jdk1.5.0_12 3.监控本机: jps查看 ...