在实际开发中,我们不可能只是简简单单地去查询单表,绝大部分都是要对多表进行联合查询的。所以本文就来讲述Hibernate中的多表查询,讲之前,大家可以先复习一下使用SQL语句是如何进行多表查询的。这里我给大家提个醒,本文所有案例代码的编写都是建立在前一讲案例基础之上的!!!
SQL多表查询
SQL的多表查询可分为连接查询和子查询,子查询其实就是SQL嵌套(在这里,它并不是咱的重点,所以我就不展开讲解了),这里我会重点讲解连接查询。
连接查询
连接查询又分为交叉连接(CROSS JOIN)、内连接(INNER JOIN ON)以及外连接。
交叉连接
交叉连接其实是没有实际意义的,它会产生迪卡尔积。例如:
SELECT * FROM cst_customer, cst_linkman;
内连接
使用内连接,它只能将有关联的数据得到,也就是说内连接查询到的是两张表的公共部分。内连接可分为两种,它们分别是隐式内连接和显示内连接。
隐式内连接
内连接有一种隐式内连接,它使用"逗号"将表分开,使用WHERE来消除迪卡尔积。例如:
SELECT * FROM cst_customer c,cst_linkman l WHERE c.cust_id=l.lkm_cust_id;
显示内连接
显示内连接如果写全的话,就像下面这样,但是我们应知道INNER是可以省略的。
SELECT * FROM cst_customer c INNER JOIN cst_linkman l ON c.cust_id=l.lkm_cust_id;
外连接
外连接也可分为两种,它们分别是左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。
左外连接
左外连接是以左表为基准关联数据,说的大白话一点就是它展示的数据只是在左表中有的,右表中没有的不管,也就是说它查询到的是左边表的全部数据以及两张表的公共部分。
左外连接如果写全的话,就像下面这样,但是我们应知道OUTER是可以省略的。
SELECT * FROM cst_customer c LEFT OUTER JOIN cst_linkman l ON c.cust_id=l.lkm_cust_id;
右外连接
右外连接是以右表为基准关联数据,说的大白话一点就是它展示的数据只是在右表中有的,左表中没有的不管,也就是说它查询到的是右边表的全部数据以及两张表的公共部分。
右外连接如果写全的话,就像下面这样,但是我们应知道OUTER是可以省略的。
SELECT * FROM cst_customer c RIGHT OUTER JOIN cst_linkman l ON c.cust_id=l.lkm_cust_id;
HQL多表查询
HQL中的多表查询可分为下面几类。
温馨提示:在Hibernate框架中有迫切连接的这一概念,而在SQL中是没有的。
内连接
显示内连接
显示内连接使用的是inner join with。如果是在MySQL中使用显示内连接,SQL语句是咋写的,你还记得吗?
SELECT * FROM cst_customer c INNER JOIN cst_linkman l ON c.cust_id = l.lkm_cust_id;
但在Hibernate框架中,我们则要这样书写HQL语句,是不是大不同啊!
from Customer c inner join c.linkMans
为了便于测试,我们可以在com.meimeixia.hibernate.demo01包下编写一个HQLJoinTest单元测试类,并在该类中编写这样的一个测试方法:
package com.meimeixia.hibernate.demo01;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.meimeixia.hibernate.utils.HibernateUtils;