java 迫切右连接_Hibernate 迫切连接和普通连接的区别

1 packagecom.baidu.test;2

3 importjava.util.ArrayList;4 importjava.util.LinkedHashSet;5 importjava.util.List;6

7 importorg.hibernate.Query;8 importorg.hibernate.Session;9 importorg.hibernate.SessionFactory;10 importorg.hibernate.Transaction;11 importorg.hibernate.cfg.Configuration;12 importorg.hibernate.service.ServiceRegistry;13 importorg.hibernate.service.ServiceRegistryBuilder;14 importorg.junit.After;15 importorg.junit.Before;16 importorg.junit.Test;17

18 importcom.baidu.leftJoin.Department;19 importcom.baidu.leftJoin.Employee;20

21 public classTestHQL_LeftJoin {22

23 privateSessionFactory sessionFactory;24 privateSession session;25 privateTransaction transaction;26

27

28 @Before29 public voidinit(){30 Configuration configuration = newConfiguration().configure();31 ServiceRegistry serviceRegistry = newServiceRegistryBuilder()32 .applySettings(configuration.getProperties())33 .buildServiceRegistry();34

35 sessionFactory =configuration.buildSessionFactory(serviceRegistry);36

37 session =sessionFactory.openSession();38 transaction =session.beginTransaction();39 }40 @After41 public voiddestroy(){42 transaction.commit();43 session.close();44 sessionFactory.close();45

46 }47

48 //~~~~~~~~~~~~~~~~~~~~~~~~~~下面的例子是 从 1 对 多 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

49

50 /**

51 *52 * 迫切左外连接: 特点是:如果左表有不满足条件的,也返回左表不满足条件53 * 1. LEFT JOIN FETCH 关键字表示迫切左外连接检索策略.54 * 2. list() 方法返回的集合中存放实体对象的引用, 每个 Department 对象关联的 Employee 集合都被初始化,55 * 存放所有关联的 Employee 的实体对象.56 * 3. 查询结果中可能会包含重复元素, 可以通过一个 HashSet 来过滤重复元素57 *58 * 去重:59 * 方法一:使用 distinct60 * String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN FETCH d.emps ";61 * Query query = session.createQuery(hql);62 *63 * List depts = query.list();64 * System.out.println(depts.size());65 *66 * 方法二67 * String hql = "FROM Department d LEFT JOIN FETCH d.emps ";68 * Query query = session.createQuery(hql);69 *70 * List depts = query.list();71 *72 * depts = new ArrayList<>(new LinkedHashSet(depts));73 * System.out.println(depts.size());74 *75 * for(Department dept:depts){76 * System.out.println(dept.getName() + "--" + dept.getEmps().size() );77 * }78 *79 *80 */

81 @Test82 public voidtestLeftJoinFetch(){83 //String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN FETCH d.emps ";84 //Query query = session.createQuery(hql);85 //

86 //List depts = query.list();87 //System.out.println(depts.size());88 //

89

90

91 String hql = "FROM Department d LEFT JOIN FETCH d.emps ";92 Query query =session.createQuery(hql);93

94

95 List depts =query.list();96 System.out.println(depts.size());97

98 depts = new ArrayList<>(newLinkedHashSet(depts));99 System.out.println(depts.size());100

101 for(Department dept:depts){102 System.out.println(dept.getName() + "--" +dept.getEmps().size() );103 }104 }105

106

107 /**

108 * 左外连接:109 * 1. LEFT JOIN 关键字表示左外连接查询.110 * 2. list() 方法返回的集合中存放的是对象数组类型111 * 3. 根据配置文件来决定 Employee 集合的检索策略.112 * 4. 如果希望 list() 方法返回的集合中仅包含 Department 对象,113 * 可以在HQL 查询语句中使用 SELECT 关键字114 *115 * 这样的语句查询的结果有重复:116 * String hql = "FROM Department d LEFT JOIN d.emps";117 * Query query = session.createQuery(hql);118 *119 * List results = query.list();120 * System.out.println(results.size());121 *122 * 去重:123 * 仅能使用 distinct 的方法去除重复124 *125 * String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN d.emps";126 * Query query = session.createQuery(hql);127 *128 * List depts = query.list();129 * System.out.println(depts.size());130 *131 * for(Department dept:depts){132 * System.out.println(dept.getName() + dept.getEmps().size());133 * }134 *135 */

136 @Test137 public voidtestLeftJoin(){138 String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN d.emps";139 Query query =session.createQuery(hql);140

141 List depts =query.list();142 System.out.println(depts.size());143

144 for(Department dept:depts){145 System.out.println(dept.getName() +dept.getEmps().size());146 }147

148 }149

150 /**

151 * 迫切内连接: 特点是:不返回左表不满足条件152 * INNER JOIN FETCH 关键字表示迫切内连接, 也可以省略 INNER 关键字153 * list() 方法返回的集合中存放 Department 对象的引用, 每个 Department154 * 对象的 Employee 集合都被初始化, 存放所有关联的 Employee 对象155 *156 * 内连接:157 * INNER JOIN 关键字表示内连接, 也可以省略 INNER 关键字158 * list() 方法的集合中存放的每个元素对应查询结果的一条记录, 每个元素都是对象数组类型159 * 如果希望 list() 方法的返回的集合仅包含 Department 对象, 可以在 HQL 查询语句中使用 SELECT 关键字160 *161 *162 *163 */

164 @Test165 public voidtestInnerJoinFetch(){166 //String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN FETCH d.emps ";

167 String hql = "FROM Department d INNER JOIN FETCH d.emps ";168 Query query =session.createQuery(hql);169

170

171 List depts =query.list();172 depts = new ArrayList<>(newLinkedHashSet(depts));173 System.out.println(depts.size());174

175 for(Department dept:depts){176 System.out.println(dept.getName() + "--" +dept.getEmps().size() );177 }178 }179

180

181 //~~~~~~~~~~~~~~~~~~~~~~~~~~下面的例子是 从多 对 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

182

183 @Test184 public voidtestLeftJoinFetch2(){185 String hql = "FROM Employee e LEFT JOIN FETCH e.dept";186 Query query =session.createQuery(hql);187

188 List emps =query.list();189 System.out.println(emps.size());190

191 for(Employee emp:emps){192 System.out.println(emp + " -- " +emp.getDept());193 }194

195 }196 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值