一步步学习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 ...
随机推荐
- Windows环境下安装导入tornado
首先,一台安装并配置好了python,我的python版本的肯定是2.7,直接进入tornado的环节: 下载tornado的压缩包,我的下载地址为:https://codeload.github.c ...
- 关于线程池ThreadPoolExecutor使用总结
本文引用自: http://blog.chinaunix.net/uid-20577907-id-3519578.html 一.简介 线程池类为 java.util.concurrent.Thread ...
- 【暴力,STL,水】UVa 1523 - Helicopter
Since ancient time, people have been dreaming of flying in the sky. Eventually, the dream was realiz ...
- Ionic条码扫描
http://m.blog.csdn.net/article/details?id=45843819
- over Oracle
QL code: sql over的作用及用法RANK ( ) OVER ( [query_partition_clause] order_by_clause )DENSE_RANK ( ) OVER ...
- 【Cocos2d入门教程二】Cocos2d-x基础篇
上一章已经学习了环境的搭建.这一章对基础概念进行掌握.内容大概有: 1.导演 2.场景 3.节点 4.层 4.精灵 1.导演(Director) 导演存在的主要作用: a.环境设定(帧率 初始化ope ...
- winform版简易http服务器
传人url运行(url以/结尾,例如:http://localhost:8080/web/ 监听这个url// 在浏览器 中输入 http://localhost:8080/web/?name=tes ...
- sql server 判断日期当前月有多少天
declare @tm datetime set @tm = CONVERT(datetime,'2013-3-12')declare @days intselect @days = case whe ...
- CodeSmith Template Model Output
背景:上学那会儿就接触CodeSmith,是一款非常优秀的代码自动生成工具.以前写过好些基本模版,可惜早不知道扔到哪儿去了,如今只能重新开始,把它捡回来,加油. 效果:将数据库 DataBase 应用 ...
- [Bootstrap]概述
——1.html,css,javascript框架 ——2.一般开发响应式布局或者移动优先的项目可以优先考虑 优点 1.css开发版本(可以直接上手)和源码版本(可根据l ...