十、Hibernate查询之HQL多表查询

版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
	}
	

猜你喜欢

转载自blog.csdn.net/mChenys/article/details/84790016