请注明转载地址: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)的更多相关文章

  1. 一步步学习NHibernate(10)——连接查询和子查询(2)

    请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,老魏讲述了HQL的链接查询,本章呢,老魏开始讲述HQL的子查询.子查询在SQL中也是占据着非常重要的作用,如果没有 ...

  2. 一步步学习NHibernate(8)——HQL查询(2)

    请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,老魏带着大家学习了HQL语句,发现HQL语句还是非常不错的,尤其是在懒加载的时候,书写起来比较的舒服,但是这里老魏 ...

  3. 从项目上一个子查询扩展学习开来:mysql的查询、子查询及连接查询

    上面这样的数据,想要的结果是:如果matchResult为2的话,代表是黑名单.同一个softId,version,pcInfoId的代表是同一个软件,需要去重:同时,如果相同软件里面只要有一个mat ...

  4. mysql的查询、子查询及连接查询

    >>>>>>>>>> 一.mysql查询的五种子句         where(条件查询).having(筛选).group by(分组). ...

  5. Mysql的查询语句(联合查询、连接查询、子查询等)

    Mysql的各个查询语句(联合查询.连接查询.子查询等) 一.联合查询 关键字:union 语法形式 select语句1 union[union选项] select 语句2 union[union选项 ...

  6. mysql查询、子查询、连接查询

    mysql查询.子查询.连接查询 一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.gr ...

  7. mysql之连接查询、联合查询、子查询

    本文内容: 连接查询 联合查询 子查询 from子查询 where子查询 exists子查询 首发日期:2018-04-11 连接查询: 连接查询就是将多个表联合起来查询,连接查询方式有内连接.外连接 ...

  8. MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习

    MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...

  9. MySQL连接查询、联合查询、子查询

    参考地址:http://blog.csdn.net/u011277123/article/details/54863371 1.MySQL连接查询 连接查询:将多张表(>=2)进行记录的连接(按 ...

随机推荐

  1. 显示创建一个表的SQL语句

    显示创建数据库中包的语句,从而可以方便的对表的结构进行修改和复制(当然还有其他的方式) 显示表结构: 显示创建表语句: show create table tablename;

  2. Linux系统内核制作和内核模块的基础

    Linux系统内核制作 1.清除原有配置与中间文件 x86:  make distclean arm:  make distclean 2.配置内核 x86:  make menuconfig arm ...

  3. HTTP层 —— Session

    1.简介 由于HTTP驱动的应用是无状态的,所以我们使用Session来存储用户请求信息.Laravel通过干净.统一的API处理后端各种Session驱动,目前支持的流行后端驱动包括Memcache ...

  4. 《跨终端Web》读书笔记

    跨终端的Web成为了趋势,而这本书就是讲了在这种趋势下进行开发的常见问题及其解决方案,可能是限于篇幅,每个方面都没有展开细说,但这是这样让本书干货满满,几乎没有一句废话. 下面是一些笔记. Web的本 ...

  5. Jersey(1.19.1) - Client API, Ease of use and reusing JAX-RS artifacts

    Since a resource is represented as a Java type it makes it easy to configure, pass around and inject ...

  6. 设计模式——设计模式之禅day1

    单一职责 原则的定义是:应该有且仅有一个原因引起类的变更. 单一职责原则有什么好处: 类的复杂性降低,实现什么职责都有清晰明确的定义: 可读性提高,复杂性降低,那当然可读性提高了: 可维护性提高,可读 ...

  7. JIRA的常用选项

    常用的一些选项有: 问题类型  Bug 测试过程维护过程发现影响系统运行的缺陷   New Feature 对系统提出的新功能  Task 需要完成的任务  Improvement 对现有系统功能的改 ...

  8. 关于web请求中 获取真实IP

    HttpRequest request = HttpContext.Current.Request; if (!string.IsNullOrEmpty(request.ServerVariables ...

  9. (转)Flickr架构

    Flickr(http://www.flickr.com/ ) 是国外一个领先的图片分享网站,现在应该在yahoo门下,感觉yahoo还是有很多好东西,奈何资本要抛弃他了.这个轮回其实挺有意思的,起先 ...

  10. lucene4入门(1)

    欢迎转载http://www.cnblogs.com/shizhongtao/p/3440325.html lucene你可以理解为一种数据库,他是全文搜索的一种引擎. 1.首先去官网download ...