一、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 代码中显式指定了检索策略, 就会覆盖映射文件中配置的检索策略