版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mChenys/article/details/84790016
关于HQL语句介绍使用可以查看这里,今天主要介绍其在多表系映射中的应用。
常用的sql语句多表查询有以下几种(以customers 和orders 表为例):
-
内连接查询
- 显示内连接
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;
- 左外连接
多表的查询中,HQL语句和SQL语句的查询语法比较类似,HQL不用书写select * 和on及后面的条件表达式,同时表名变成类名书写,其他关键字不变.
HQL的多表查询,根据返回结果划分,可分为非迫切和迫切查询,
- 非迫切:返回结果是List<Object[]>
- 迫切:返回结果是对象的集合,这个需要在join关键字后加上fetch关键字,同时需要手动解决数据重复的问题,可以通过set集合来解决
/**
* 非迫切内联查询:查询的客户及其联系人
* sql查询:select * from cst_customer c,cst_linkman l where c.cust_id = l.lkm_cust_id;
* HQL查询: from Customer c inner join c.linkmans
*/
@Test
public void test1() {
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
Query query = session.createQuery("from Customer c inner join c.linkmans");
// 默认的返回值是数组
List<Object[]> list = query.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
tr.commit();
}
/**
* 迫切内联查询:查询的客户及其联系人
* sql查询:select * from cst_customer c,cst_linkman l where c.cust_id = l.lkm_cust_id;
* HQL查询: from Customer c inner join fetch c.linkmans
*
* 使用fetch关键字,把数据封装到对象中
*/
@Test
public void test2() {
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
Query query = session.createQuery("from Customer c inner join fetch c.linkmans");
// 默认返回的数据是没有解决重复问题的
List<Customer> list = query.list();
for (Customer c : list) {
// System.out.println(c);
}
//手动解决数据重复的问题
Set<Customer> set = new HashSet<>(list);
for (Customer c : set) {
System.out.println(c);
}
tr.commit();
}
/**
* 迫切左外查询:查询的客户及其联系人
* sql查询:select * from cst_customer c left join cst_linkman l on c.cust_id = l.lkm_cust_id
* HQL查询: from Customer c left join fetch c.linkmans
*
* 使用fetch关键字,把数据封装到对象中
*/
@Test
public void test3() {
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
Query query = session.createQuery("from Customer c left join fetch c.linkmans");
//手动解决数据重复的问题
Set<Customer> set = new HashSet<>(query.list());
for (Customer c : set) {
System.out.println(c);
}
tr.commit();
}