请注明转载地址: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. java调用.net asmx服务

    有时候,在java下开发会调用一下.net下写的服务,看网上有各种方法,但总是不成功,总结下自己测试过能调用成功的方式: 1. 原始方式http-soap public static String p ...

  2. 设计包含min函数的栈

    stack<pair<int, int>> sta; void push(int x) { int min_i; if(sta.empty()) { min_i = x; } ...

  3. ARM体系结构简介

    ARM体系结构简介 新一代的ARM9处理器,能达到两倍ARM7的处理能力,它们的区别如下: ARM微处理器的工作状态(可切换): 第一种为ARM状态,此时处理器执行32位的字对齐的ARM指令 第二种为 ...

  4. poj 2749 2-SAT问题

    思路:首先将hate和friend建边求其次2-SAT问题,判断是否能有解,没解就输出-1,否则用二分枚举最大的长度,将两个barn的距离小于mid的看做是矛盾,然后建边,求2-SAT问题.找出最优解 ...

  5. 【原创】 windows下开发软件推荐

    1. 数据库查看器工具 navicat.exe

  6. 自定义表单样式之checkbox和radio

    1,起因 最近在工作中要实现自定义式的radio样式,而我们通常使用的时默认的样式,因为自己实在想不到解决的方法,于是开始搜索,最终看到了不错的解决办法,可以完美解决我们遇到的问题. 2,原理 大家都 ...

  7. ActiveMQ(5.10.0) - Configuring the JAAS Authentication Plug-in

    JAAS provides pluggable authentication, which means ActiveMQ will use the same authentication API re ...

  8. Linux 命令 - df: 报告磁盘空间的占用情况

    df 命令列出指定的文件名所在的文件系统上可用磁盘空间的数量. 如果没有指定文件名,则显示当前所有使用中的文件系统.默认情况下,磁盘空间以 1K 为一块显示,如果设置了环境变量 POSIXLY_COR ...

  9. HDOJ2013蟠桃记

    蟠桃记 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  10. JDBC之初识

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...