HQL多表查询

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

6.4 HQL的多表查询

对象之间总是有各种各样的关系,关联关系是类之间最常见的关系。多表查询是HQL中的强大功能之一,包括内连接、左连接和右连接等。多表查询的设置及运行都比较麻烦,在运行本节中的示例时,务必保证每一步都没有错误。

6.4.1 表之间的关联关系

在数据库joblog中用到了3个表:student(学生表)、course(课程表)和sc(选课表)。这些表的详细信息见6.1.1节“示例中用到的默认数据库表和数据”。在现实模型中,一个学生可以选择多门课程,一个课程可以被多个学生选择,student和course是多对多的关联关系。为了便于演示HQL的多表查询,本节中假设student和course之间是单向关联关系。

在多对多的关联关系中,一般来说有个中间表,这个表描述了多对多关系,这就是选课表sc,sc每一行数据代表一个学生的选课和成绩。

各个表的主键、外键设置如下。

student表的主键是id字段。

course表的主键是id字段。

sc表的主键是id字段。

sc表中的Sno字段是student表id字段的外键。

sc表中的Cno字段是course表id字段的外键。

图6-8是3个表之间关系的直观表示。

图6-8 3个表之间的关系

在MySQL Query Browser中设置好上述关系。如果此处设置不正确,可能会影响多表连接查询。其中sc表的建表信息如下(其中包含了外键关系)。

CREATE TABLE 'joblog'. 'sc' (

'id' int(10) unsigned NOT NULL auto_increment COMMENT 'id',

'Sno' int(10) unsigned NOT NULL default '0' COMMENT '学号',

'Cno' int(10) unsigned NOT NULL default '0' COMMENT '课程号',

'Grade' int(10) unsigned default NULL COMMENT '成绩',

PRIMARY KEY ('id'),

KEY 'FK_sc_1' ('Sno'),

KEY 'FK_sc_2' ('Cno'),

CONSTRAINT 'FK_sc_1' FOREIGN KEY ('Sno') REFERENCES 'student' ('id'), /* 外键信息*/

CONSTRAINT 'FK_sc_2' FOREIGN KEY ('Cno') REFERENCES 'course' ('id') /* 外键信息 */

) ENGINE=InnoDB DEFAULT CHARSET=gb2312;

6.4.2 表中的数据

这一节中用到了3个表的数据,student表和course表的数据如6.1节中图6-2和6-4所示,但是sc表的内容变为图6-9所示的数据,其中Sno 和Cno存储的分别是student表和course表中对应的主键值。

图6-9 本节中所用的表sc中的内容

6.4.3 修改持久化类

Student对象和Course对象之间是多对多的关系。此处使用的是单向关联,仅仅建立从Student到Course的单向关联。如图6-10所示,仅有Student到Course的单向关联。

图6-10 Student到Course类的单向关联

为了建立Student到Course的单向关联关系,在Student.java中新加一个属性course。course属性是Set型的,可以在这个属性中加入多个Course对象,建立起关联关系。下面是加入course属性后的源代码,粗体部分为加入的代码。

package hibernate.ch06;

import java.util.HashSet;

import java.util.Set;

public class Student implements java.io.Serializable {

private Integer id; //ID

private Integer sno; //学号

private String sname; //姓名

private String ssex; //性别

private String sdept; //系部

private Integer sage; //年龄

private String saddress; //住址

private Set course=new HashSet(); //所选课程

public Student() {

}

//此处省略其他的构造方法

//此处省略getter/setter访问器

//course属性的get访问器

public Set getCourse() {

return course;

}

//course属性的set访问器

public void setCourse(Set course) {

this.course = course;

}

}

持久化类Course.java和SC.java无需修改。

6.4.4 在映射文件中加入关联信息

在Student.hbm.xml映射配置文件中,加入Student到Course的映射信息。关于如何映射关联关系,将在第8章讲解,读者可暂时按照下面的设置,具体含义等阅读完第八章便可理解。具体代码如下。

说明如下。

元素是和元素平行的元素。元素表明将要映射的字段对应着一个集合。元素包含多个属性,其中:name属性用于设置映射的持久化类的属性名称,在本例中为Student表的course属性;table属性表示多对多关联关系的中间表名称,此处为sc表;cascade表示当保存或者更新Student实例时,是否保存或更新Course 对象。

元素的子元素设定与student表关联的中间表sc的外键sno。

元素的子元素用于设定多对多关系。在该元素中,class属性用于设定多对多关系中,与Student类关联的类Course类;column属性设定中间表与course表连接的外键cno。

完整的配置文件Student.hbm.xml如下所示。

相关文档
最新文档