一步步学习NHibernate(9)——连接查询和子查询(1)

摘要:
请注明转载地址:http://www.cnblogs.com/arhat在前几章中,我们把HQL的基本查询学习了一下,但是只有基本查询很显然不能满足我们的需求,那么就需要一下复杂查询比如”连接查询“,”子查询“等。本章我们就围绕着这两个查询来学习一下。现在我们的数据库中只有Student和Clazz两张表,同时这两张表有着多对一和一对多的关系,那么我们就根据这两张表来讲述连接查询吧(当然了,各位网

请注明转载地址: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 inlist)
 {

                Model.Student student = objs[0] asModel.Student;

                Model.Clazz clazz = objs[1] asModel.Clazz;

    Console.WriteLine(student.SName + "-----" +clazz.CName);

  }

从HQL语句中,我们可以看出,在使用链接查询的时候有几个关键点:

1,需要给对象起个别名

2,链接的对象是查询对象的属性。

wps_clip_image-11357

大家可以从图上看出,NHibernate生成的SQL语句是一个left outer join。但是这是把Student作为左表了,由于Student和Clazz之间一个是多对一的关系,所以Student中的记录是肯定能和Clazz相匹配的,但是我们现在,看看Clazz表和Student中的记录。

wps_clip_image-24970

从图上可以看出,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 inlist)

{

Console.WriteLine(objs[0] + "-----" + objs[1]);

            }

wps_clip_image-11361

从运行结果上看,那么最后一个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 inlist)

            {

                Model.Clazz clazz = objs[0] asModel.Clazz;

                Model.Student student = objs[1] asModel.Student;

if (objs[1] != null)

                {

Console.WriteLine(clazz.CName + "-----" +student.SName);

                }

else
                {

Console.WriteLine(clazz.CName + "-----此班级没有学生");

                }

            }

wps_clip_image-2950

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 inlist)

            {

                Model.Clazz clazz = objs[0] asModel.Clazz;

                Model.Student student = objs[1] asModel.Student;

Console.WriteLine(clazz.CName + "-----" +student.SName);

            }

由于是inner join,所以我们在这里就无需判断对象是否为空了。

wps_clip_image-19806

好了,这一章就讲到这里吧,这一章主要是讲述了链接查询,其中的 inner join 是我们最为常用的,所以需要大家能够好好的练习。

免责声明:文章转载自《一步步学习NHibernate(9)——连接查询和子查询(1)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue element UI el-table 单元格中超出字省略号显示Halcon学习笔记之支持向量机(一)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Hive(1)-基本概念

一. 什么是Hive Hive:由Facebook开源用于解决海量结构化日志的数据统计。 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。 本质是:将HQL(Hive Query Language)转化成MapReduce程序 1)Hive处理的数据存储在HDFS 2)Hive分析数据底层的实现是...

Java多线程-线程的调度(合并)

线程的合并的含义就是将几个并行线程的线程合并为一个单线程执行,应用场景是当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法。 join为非静态方法,定义如下:void join(): 等待该线程终止。void join(long millis): 等待该线程终止的时间最长为 millis 毫秒。void join(long millis,...

sql级联查询 join

昨晚参加了一个公司的笔试,里面有一题考察了sql语句的书写,内容如下 假设有两个表tableA(id,name,……)tableB(id,……),tableA与tableB中的id一致,此时的查询语句可表示为: select * from tableA join tableB on tableA.id=talbeB.id 问题延伸,若两个表中一致的字段名称...

hibernate的配置文件(ORM元数据配置、主配置文件)

一、orm元数据配置: 位置在实体类的包中:  一个关于学生表和学生实体的一对一映射文件的配置: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3....

Java程序员从笨鸟到菜鸟之(五十二)细谈Hibernate(三)Hibernate常用API详解及源码分析--csdn 曹胜欢

新接触一个框架的目的就是想利用这个框架来为我们做一些工作,或者是让他来简化我们的工作,利用这个框架无非就是要利用这个框架所给我们提供的API去操作我们的数据,所以利用一个框架的好坏很大一部分取决于你对这个框架API的理解程度,所以在此篇博客中我们就一起来看一下Hibernate的API和配置文件的相信情况。下面我们一一来看一下: 一:使用SchemaExp...

Jboss

是一个基于J2EE的开放源代码的应用服务器。 JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用,而不用支付费用。JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3的规范。但JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。 产品特点 编辑 在J2EE应...