一步步学习NHibernate(9)——连接查询和子查询(1)
请注明转载地址:http://www.cnblogs.com/arhat
在前几章中,我们把HQL的基本查询学习了一下,但是只有基本查询很显然不能满足我们的需求,那么就需要一下复杂查询比如”连接查询“,”子查询“等。本章我们就围绕着这两个查询来学习一下。
现在我们的数据库中只有Student和Clazz两张表,同时这两张表有着多对一和一对多的关系,那么我们就根据这两张表来讲述连接查询吧(当然了,各位网友可以根据自身的情况来学习)。
在NHibernate中,提供了4中连接查询分别是left outer join ,right outer join,innner join和full join(这个Nhibnerate不推荐使用)。那么下面我们来讲述一下这3个常用的连接查询。
其实说是链接查询,倒不如说是关联查询,因为在查询的过程中,我们书写的HQL 语句是比较特殊的。大家可以看看下面的案例。
1,left outer join
首先我们得弄明白什么是左连接查询,做链接查询是指在查询的时候,把左边表的数据全部查询出来,如果右表的数据和左表数据没有关联的,则右表的数据时使用null来表示。
string hql = "from Student as t left join t.Clazz"; IList<object[]> list = DAL.NHibernateHelper.CreateQuery(hql, null).List<object[]>(); foreach (object[] objs in list)
{ Model.Student student = objs[0] as Model.Student; Model.Clazz clazz = objs[1] as Model.Clazz; Console.WriteLine(student.SName + "-----" + clazz.CName); }
从HQL语句中,我们可以看出,在使用链接查询的时候有几个关键点:
1,需要给对象起个别名
2,链接的对象是查询对象的属性。
大家可以从图上看出,NHibernate生成的SQL语句是一个left outer join。但是这是把Student作为左表了,由于Student和Clazz之间一个是多对一的关系,所以Student中的记录是肯定能和Clazz相匹配的,但是我们现在,看看Clazz表和Student中的记录。
从图上可以看出,Clazz中有一个“SQL Server”这个班级,但是Student中却没有这个班级,所以,如果我们把Clazz作为左表,那么将会是一种什么情况呢,我们来改一下代码,并运行。
string hql = "from Clazz as t left join t.Students"; IList<object[]> list = DAL.NHibernateHelper.CreateQuery(hql, null).List<object[]>(); foreach (object[] objs in list) { Console.WriteLine(objs[0] + "-----" + objs[1]); }
从运行结果上看,那么最后一个Model.Clazz对象没有Model.Student对应。我们把上面的代码改写一下,把详细内容显示出来。
string hql = "from Clazz as t left join t.Students"; IList<object[]> list = DAL.NHibernateHelper.CreateQuery(hql, null).List<object[]>(); foreach (object[] objs in list) { Model.Clazz clazz = objs[0] as Model.Clazz; Model.Student student = objs[1] as Model.Student; if (objs[1] != null) { Console.WriteLine(clazz.CName + "-----" + student.SName); } else { Console.WriteLine(clazz.CName + "-----此班级没有学生" ); } }
2,right outer join
那么对于right outer join,老魏在这里不在讲述了,因为它和上面的left outer join 用法是一样的。虽然老魏在这里不再讲述了,那么希望大家能够私下中自行的学习。如果发现有什么问题,可以给老魏留言。
3,full join
对于full join由于full join将会产生一个笛卡尔积,而且在实际开发中几乎不会用,所以老魏在这里就不再讲述这个问题了,如果想了解的话可以查看一下NHibernate的帮助文档,NHibernate也不推荐使用的。
4,inner join
innner join 对于我们来说可是相当的重要,因为它只把两个表之间的匹配数据查出来,不匹配的则不查询,所以找个非常常用。
string hql = "from Clazz as t inner join t.Students"; IList<object[]> list = DAL.NHibernateHelper.CreateQuery(hql, null).List<object[]>(); foreach (object[] objs in list) { Model.Clazz clazz = objs[0] as Model.Clazz; Model.Student student = objs[1] as Model.Student; Console.WriteLine(clazz.CName + "-----" + student.SName); }
由于是inner join,所以我们在这里就无需判断对象是否为空了。
好了,这一章就讲到这里吧,这一章主要是讲述了链接查询,其中的 inner join 是我们最为常用的,所以需要大家能够好好的练习。
一步步学习NHibernate(9)——连接查询和子查询(1)的更多相关文章
- 一步步学习NHibernate(10)——连接查询和子查询(2)
请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,老魏讲述了HQL的链接查询,本章呢,老魏开始讲述HQL的子查询.子查询在SQL中也是占据着非常重要的作用,如果没有 ...
- 一步步学习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之连接查询、联合查询、子查询
本文内容: 连接查询 联合查询 子查询 from子查询 where子查询 exists子查询 首发日期:2018-04-11 连接查询: 连接查询就是将多个表联合起来查询,连接查询方式有内连接.外连接 ...
- MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习
MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...
- MySQL连接查询、联合查询、子查询
参考地址:http://blog.csdn.net/u011277123/article/details/54863371 1.MySQL连接查询 连接查询:将多张表(>=2)进行记录的连接(按 ...
随机推荐
- static关键字的用法和main函数
一.static关键字:静态的,它可以修饰成员变量和成员方法 1.修饰成员变量的情况,当类所属对象中存在共享数据时,我们就可以把数据对应的属性定义为静态的,这里的共享数据是对象数据相同,而不是拥有相同 ...
- WIN7 X64 如何运行debug
WIN7 X64 如何运行debug 下载debug.exe 安装dosbox 安装完成后将debug.exe放入某个盘的根目录下(以c盘为例) 然后运行dosbox,输入 mount c c:\ c ...
- Adobe Edge Animate –svg地图交互-精确的边缘及颜色置换
Adobe Edge Animate –svg地图交互-精确的边缘及颜色置换 版权声明: 本文版权属于 北京联友天下科技发展有限公司. 转载的时候请注明版权和原文地址. 上一篇我们说到了使用jquer ...
- 查锁表及kill
当一个表一直被锁住而无法进行操作的时候,可以用如下方法 select l.session_id sid, s.serial#, l.locked_mode 锁模式, l.oracle_username ...
- C++STL学习笔记_(4)queue
10.2.5Queue容器 Queue简介 ² queue是队列容器,是一种"先进先出"的容器. ² queue是简单地装饰deque容器而成为另外的一种容器. ² #inc ...
- 一步步搭建自己的轻量级MVCphp框架-(一)什么是PHP框架以及MVC设计模式
PHP框架 php框架对很多新手而言可能会觉得很难攀越,其实不然 ,只要知道一个框架的流程,明白原理了,基本类似框架都可以看懂,php框架真正的发展要从php5开始了,其实php4时代就有一些框架,但 ...
- 晒下自己App广告平台积分墙收入,顺便点评几个广告平台
这是我之前发在爱开发App源码论坛的文章.分享了我从2011年到现在移动广告方面的收入和一些心得. 产品类型:FC.街机模拟器类App游戏 广告平台:万普世纪 广告形式:积分墙,用户先试玩几次,再玩需 ...
- money 转换成 varchar
Sql :cast(sum(colname) as varchar) 或者 convert(varchar,sum(colname)) ),sum(colname))
- Oracle + Entity Framework 更新没有设置主键的表
最近用Entity Framework 开发的时候,发现一个问题,在默认情况下,EF不能对一个没有主键的表进行更新.插入和删除的动作. 那么,应该怎么处理没有主键的表呢? 我们打开这个表的edmx文件 ...
- NodeJs获取函数名称和函数操作整理
var aa = function () { log("xxxx"); }; aa(); var model = {}; model.test = function () { lo ...