HQL多表查询

来源:互联网 发布:java中方法的返回值 编辑:程序博客网 时间:2024/05/22 10:24
**技术分析之HQL多表查询**

1. 多表的查询进来使用HQL语句进行查询,HQL语句和SQL语句的查询语法比较类似。
* 内连接查询
* 显示内连接
* select * from customers c inner join orders o on c.cid = o.cno;
* 隐式内连接
* select * from customers c,orders o where c.cid = o.cno;

* 外连接查询
* 左外连接
* select * from customers c left join orders o on c.cid = o.cno;
* 右外连接
* select * from customers c right join orders o on c.cid = o.cno;

2. HQL的多表查询
* 迫切和非迫切:
* 非迫切返回结果是Object[]
* 迫切连接返回的结果是对象,把客户的信息封装到客户的对象中,把订单的信息封装到客户的Set集合中。

3. 内连接查询
* 内连接使用 inner join ,默认返回的是Object数组
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
List<Object[]> list = session.createQuery("from Customer c inner join c.linkmans").list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
tr.commit();

* 迫切内连接:inner join fetch ,返回的是实体对象
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
List<Customer> list = session.createQuery("from Customer c inner join fetch c.linkmans").list();
Set<Customer> set = new HashSet<Customer>(list);
for (Customer customer : set) {
System.out.println(customer);
}
tr.commit();

4. 左外连接查询
* 左外连接: 封装成List<Object[]>

* 迫切左外连接
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
List<Customer> list = session.createQuery("from Customer c left join fetch c.linkmans").list();
Set<Customer> set = new HashSet<Customer>(list);
for (Customer customer : set) {
System.out.println(customer);
}
tr.commit();