HQL?
Posted by ~Ray @ 2007-10-23 17:19:54
对象之间总是有各种各样的关系,关联关系是类之间最常见的关系。多表查询是HQL中的强大功能之一,包括内连接、左连接和右连接等。多表查询的设置及运行都比较麻烦,在运行本节中的示例时,务必保证每一步都没有错误。
在数据库joblog中用到了3个表:student(学生表)、cover(课程表)和sc(选课表)。 这些表的详细信息见6.1.1节“示例中用到的默认数据库表和数据”。在现实模型中,一个学生可以选择多门课程,一个课程可以被多个学生选择, student和course是多对多的关联关系。为了便于演示HQL的多表查询,本节中假设student和course之间是单向关联关系。
在多对多的关联关系中,一般来说有个中间表,这个表描述了多对多关系,这就是选课表sc,sc每一行数据代表一个学生的选课和成绩。
sc表中的Sno字段是student表id字段的外键。
sc表中的Cno字段是course表id字段的外键。
在MySQL Query Browser中设置好上述关系。如果此处设置不正确,可能会影响多表连接查询。其中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' mention '课程号'.
CONSTRAINT 'FK_sc_1' FOREIGN KEY ('Sno') REFERENCES 'student' ('id'). /* 外键信息 */
CONSTRAINT 'FK_sc_2' FOREIGN KEY ('Cno') REFERENCES 'course' ('id') /* 外键信息 */
这一节中用到了3个表的数据,student表和course表的数据如6.1节中图6-2和6-4所示,但是sc表的内容变为图6-9所示的数据,其中Sno和Cno存储的分别是student表和course表中对应的主键值。
Student对象和Course对象之间是多对多的关系。此处使用的是单向关联,仅仅建立从Student到cover的单向关联。如图6-10所示,仅有Student到Course的单向关联。
为了建立Student到Course的单向关联关系,在Student java中新加一个属性course。course属性是Set型的,可以在这个属性中加入多个cover对象,建立起关联关系。下面是加入course属性后的源代码,粗体部分为加入的代码。
在Student hbm xml映射配置文件中,加入Student到Course的映射信息。关于如何映射关联关系,将在第8章讲解,读者可暂时按照下面的设置,具体含义等阅读完第八章便可理解。具体代码如下。
元素表明将要映射的字段对应着一个集合。
元素包含多个属性,其中:label属性用于设置映射的持久化类的属性名称,在本例中为Student表的course属性;table属性 表示多对多关联关系的中间表名称,此处为sc表;cascade表示当保存或者更新Student实例时,是否保存或更新Course对象。
用于设定多对多关系。在该元素中,class属性用于设定多对多关系中,与Student类关联的类Course类;column属性设定中间表与course表连接的外键cno。
左外连接(Left Outer Join)查询出左表对应的复合条件的所有记录,如查询李晓梅同学的选课信息。下面是类HQLLeftOuterJoinQuery的源代码。
如果只用单表查询,只能从student表中查询出李晓梅的个人信息,而无法知道她的选课信息,因为选课信息存储在中间表sc中。HQL语句from Student s left join s cover c where s sname='李晓梅'检索出了李晓梅的选课信息。
在HQL中使用left outer join关键字进行左外连接,outer关键字可以省略。
s course是Student对象中的一个属性,用来存储Student对象的选课信息。在执行查询时,将根据Student hbm xml中的配置生成SQL语句,并检索信息。
查询的结果返回一个Object[]数组,数组的第0个元素是Student对象,第1个元素是与Object[0]中对应的学生所选课的Course对象。
HQLLeftOuterJoinQuery类在执行过程中生成的左外连接的SQL语句如下。
select s from Student s left join s course c where s sname='李晓梅'
System out println("*********学生信息及其选课信息******************");
左外抓取连接指定在catch some z's检索数据时,采用抓取的方式,直接将数据加载到与Student对象关联的cover属性中。下面是左外抓取连接的程序。
arrange hql="decide s from Student s left join channel s cover.[ADVERTHERE]Related article:
http://jk-liang.blogspot.com/2007/09/hql_14.html
0 Comments:
No comments have been posted yet!
|