首页 > 代码库 > HQL多表查询
HQL多表查询
------------------siwuxie095
HQL 多表查询
以客户和联系人为例(一对多)
1、内连接
(1)hql 语句写法
from Customer c inner join c.linkManSet
(2)具体实现
/* * (1) 创建 Query 对象 * * 调用 session 的 createQuery() 方法,参数是 hql * 语句,返回值是 Query 类型,创建以接收 */ Query query=session.createQuery("from Customer c inner join c.linkManSet");
/* * (2) 调用方法得到结果 * * 调用 query 的 list() 方法,返回值是 List 类型, * 创建以接收 * * 注意:此时返回的 List 的每部分都是一个数组,而 * 不是 Customer 对象或 LinkMan 对象,所以指定泛 * 型为 Object[] */ List<Object[]> list=query.list();
for (Object[] obj : list) {
Customer customer=(Customer) obj[0]; LinkMan linkMan=(LinkMan) obj[1]; System.out.println(customer.getCustName()+"-"+linkMan.getLkmName());
} |
(3)返回的 List 中,每部分都是一个数组
2、迫切内连接
(1)迫切内连接 和 内连接 的底层实现(即 sql 语句)都一样
(2)区别:
1)内连接返回的 List 中,每部分都是一个数组
2)迫切内连接返回的 List 中,每部分都是一个对象
(3)hql 语句写法
from Customer c inner join fetch c.linkManSet
(4)具体实现
/* * (1) 创建 Query 对象 * * 调用 session 的 createQuery() 方法,参数是 hql * 语句,返回值是 Query 类型,创建以接收 */ Query query=session.createQuery("from Customer c inner join fetch c.linkManSet");
/* * (2) 调用方法得到结果 * * 调用 query 的 list() 方法,返回值是 List 类型, * 创建以接收 * * 注意:此时返回的 List 的每部分都是一个 Customer * 对象 */ List<Customer> list=query.list();
for (Customer cust : list) { System.out.println(cust.getCustName()+"-"+cust.getLinkManSet().size()); } |
3、左外连接
(1)hql 语句写法
from Customer c left outer join c.linkManSet
(2)左外连接返回的 List 中,每部分都是一个数组
4、迫切左外连接
(1)hql 语句写法
from Customer c left outer join fetch c.linkManSet
(2)迫切左外连接返回的 List 中,每部分都是一个对象
5、右外连接
(1)hql 语句
from Customer c right outer join c.linkManSet
(2)右外连接返回的 List 中,每部分都是一个数组
「注意:没有迫切右外连接」
【made by siwuxie095】
HQL多表查询