一步步学习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 ...
随机推荐
- [改善Java代码]适时选择getDeclaredxxx和getxxx
Java的Class类提供了很多的getDeclaredxxx方法和getxxx方法,例如getDeclaredmethod和getMethod成对出现,getDeclaredConstructors ...
- [改善Java代码]若有必要,使用变长数组
Java中的数组是定长的,一旦经过初始化声明就不可改变长度,这在实际使用的时候非常不方便.比如要对一个班级的学生信息进行统计,因为我们不知道班级会有多少个学生(随时可能有退学,入学,转学),所以需要一 ...
- asp.net mvc 的几种分页Pager
第一种 /// <summary> /// 分页Pager显示 /// </summary> /// <param name="html">&l ...
- C# 按指定数量从前面或者后面删除字符串
为了方便处理一些数据,自己写一个小程序来辅助工作,提高点效率. 不够删除怎么办呢!?一般程序员都会马上想到的是,用if判断…….这里其实不用if语句也可以轻松实现的! 有些程序员还可能用 try c ...
- Linux 命令 - ping: 向网络主机发送 ICMP ECHO_REQUEST 包
ping 命令会向指定的网络主机发送特殊网络数据报 IMCP ECHO_REQUEST.多数网络设备收到该数据包后会做出回应,通过此法即可验证网络连接是否正常. 有时从安全角度出发,通常会配置部分网络 ...
- jQuery性能优化(转)
摘要:jQuery是我们经常使用的强大的JS类库,因此它的性能优化十分重要,下面就重几点来说明 原文作者:szyuxueliang 原文地址:http://www.cnblogs.com/yxl ...
- STL vector+sort排序和multiset/multimap排序比较
由 www.169it.com 搜集整理 在C++的STL库中,要实现排序可以通过将所有元素保存到vector中,然后通过sort算法来排序,也可以通过multimap实现在插入元素的时候进行排序.在 ...
- LINQ(LINQ to Entities)
LINQ to Entities 是 LINQ 中最吸引人的部分.它让你可以使用标准的 C# 对象与数据库的结构和数据打交道.使用 LINQ to Entities 时,LINQ 查询在后台转换为 S ...
- 基本排序算法的java实现
本例子实现了一些常见的排序算法,注释中也有一些关于这些算法的思想的描述,这里不做多说,直接上代码. import java.awt.List; import java.util.ArrayList; ...
- Shell 循环读取文件
使用Shell将Windows环境下的文件拷贝到Linux下面的用法. 在linux下,将dos文件格式转换成linux文件格式的用法,vi打开,然后转到命令格式,执行,然后保存,就可以转换成linu ...