本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用
内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。
本人互联网技术爱好者,互联网技术发烧友
微博:伊直都在0221
QQ:951226918
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.HQL (迫切)左外连接 推荐使用
1)LEFT JOIN FETCH 关键字表示迫切左外连接检索策略.
2)list() 方法返回的集合中存放实体对象的引用, 每个 Department 对象关联的 Employee 集合都被初始化, 存放所有关联的 Employee 的实体对象.
3)查询结果中可能会包含重复元素, 可以通过一个 HashSet 来过滤重复元素
去重:
@Test public void testLeftJoinFetch(){ String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN FETCH d.emps"; //使用distinct 关键字去重 String hql2 = "FROM Department d LEFT JOIN FETCH d.emps"; Query query = session.createQuery(hql2); Listdepts = query.list(); depts = new ArrayList<>( new LinkedHashSet(depts)); //使用转化去重 System.out.println(depts.size()); }
2.左外连接
1)LEFT JOIN 关键字表示左外连接查询.
2)list() 方法返回的集合中存放的是对象数组类型
3)根据配置文件来决定 Employee 集合的检索策略.
4)如果希望 list() 方法返回的集合中仅包含 Department 对象, 可以在HQL 查询语句中使用 SELECT 关键字
3.HQL (迫切)内连接
1)INNER JOIN FETCH 关键字表示迫切内连接, 也可以省略 INNER 关键字
2)list() 方法返回的集合中存放 Department 对象的引用, 每个 Department 对象的 Employee 集合都被初始化, 存放所有关联的 Employee 对象
4.内连接:
1)INNER JOIN 关键字表示内连接, 也可以省略 INNER 关键字
2)list() 方法的集合中存放的每个元素对应查询结果的一条记录, 每个元素都是对象数组类型
3)如果希望 list() 方法的返回的集合仅包含 Department 对象, 可以在 HQL 查询语句中使用 SELECT 关键字
5.关联级别运行时的检索策略
1)如果在 HQL 中没有显式指定检索策略, 将使用映射文件配置的检索策略.
2)HQL 会忽略映射文件中设置的迫切左外连接检索策略, 如果希望 HQL 采用迫切左外连接策略, 就必须在 HQL 查询语句中显式的指定它
3)若在 HQL 代码中显式指定了检索策略, 就会覆盖映射文件中配置的检索策略