Hibernate HelloWorld-12 HQL连接

一、HQL迫切左外连接

LEFT JOIN FETCH 关键字表示迫切左外连接检索策略.

list() 方法返回的集合中存放实体对象的引用, 每个 Department 对象关联的 Employee 集合都被初始化, 存放所有关联的 Employee 的实体对象.

查询结果中可能会包含重复元素, 可以通过一个 HashSet 来过滤重复元素或者distinct关键字

// 迫切左外连接:
	@Test
	public void testleftJionFetch() {

		String hql = "select distinct d From Department d left join fetch d.se";

		Query query = session.createQuery(hql);

		List<Department> ld = query.list();

		System.out.println(ld.size());
	}

二、HQL左外连接

LEFT JOIN 关键字表示左外连接查询.

list() 方法返回的集合中存放的是对象数组类型

根据配置文件来决定 Employee 集合的检索策略.

如果希望 list() 方法返回的集合中仅包含 Department 对象, 可以在HQL 查询语句中使用 SELECT 关键字,HashSet无法去重

// 左外连接:
	@Test
	public void testleftJion() {

		String hql = "select distinct d From Department d left join d.se";

		Query query = session.createQuery(hql);

		List<Department> ld = query.list();
		
		for(Department deps:ld)
			System.out.println(deps);

		System.out.println(ld.size());

		/*
		 * List<Object[]> ld = query.list();
		 * 
		 * //去重 ld = new ArrayList<>(new LinkedHashSet<>(ld)); for(Object[]
		 * obj:ld) System.out.println(obj); System.out.println(ld.size());
		 */
	}


三、HQL迫切内连接

INNER JOIN FETCH 关键字表示迫切内连接, 也可以省略 INNER 关键字

list() 方法返回的集合中存放 Department 对象的引用, 每个 Department 对象的 Employee 集合都被初始化, 存放所有关联的 Employee 对象

	// 迫切内连接:
		@Test
		public void testInnerJionFetch() {

			String hql = "select distinct d From Department d INNER JOIN FETCH d.se";

			Query query = session.createQuery(hql);

			List<Department> ld = query.list();

			System.out.println(ld.size());
		}


四、HQL内连接

INNER JOIN 关键字表示内连接, 也可以省略 INNER 关键字

list() 方法的集合中存放的每个元素对应查询结果的一条记录, 每个元素都是对象数组类型

如果希望 list() 方法的返回的集合仅包含 Department 对象, 可以在 HQL 查询语句中使用 SELECT 关键字

// 左外连接:
		@Test
		public void testInnerJion() {

			String hql = "select distinct d From Department d INNER JOIN d.se";

			Query query = session.createQuery(hql);

			List<Department> ld = query.list();
			
			for(Department deps:ld)
				System.out.println(deps);

			System.out.println(ld.size());

			/*
			 * List<Object[]> ld = query.list();
			 * 
			 * //去重 ld = new ArrayList<>(new LinkedHashSet<>(ld)); for(Object[]
			 * obj:ld) System.out.println(obj); System.out.println(ld.size());
			 */
		}


五、关联级别运行时的检索策略

  • 如果在 HQL 中没有显式指定检索策略, 将使用映射文件配置的检索策略. 
  • HQL 会忽略映射文件中设置的迫切左外连接检索策略, 如果希望 HQL 采用迫切左外连接策略, 就必须在 HQL 查询语句中显式的指定它
  • 若在 HQL 代码中显式指定了检索策略, 就会覆盖映射文件中配置的检索策略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值