Hibernate迫切連接和普通連接的區(qū)別實例詳解
更新時間:2017年12月22日 10:28:20 作者:__浮沉丶若軒◇
這篇文章主要介紹了Hibernate迫切連接和普通連接的區(qū)別實例詳解,具有一定借鑒價值,需要的朋友可以參考下。
Hibernate 迫切連接和普通連接的區(qū)別
相關(guān)的介紹和解釋在代碼中已注釋,大家可以參考。
package com.baidu.test; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.baidu.leftJoin.Department; import com.baidu.leftJoin.Employee; public class TestHQL_LeftJoin { private SessionFactory sessionFactory; private Session session; private Transaction transaction; @Before public void init(){ Configuration configuration = new Configuration().configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()) .buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); session = sessionFactory.openSession(); transaction = session.beginTransaction(); } @After public void destroy(){ transaction.commit(); session.close(); sessionFactory.close(); } // ~~~~~~~~~~~~~~~~~~~~~~~~~~下面的例子是 從 1 對 多 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /** * * 迫切左外連接: 特點是:如果左表有不滿足條件的,也返回左表不滿足條件 * 1. LEFT JOIN FETCH 關(guān)鍵字表示迫切左外連接檢索策略. * 2. list() 方法返回的集合中存放實體對象的引用, 每個 Department 對象關(guān)聯(lián)的 Employee 集合都被初始化, * 存放所有關(guān)聯(lián)的 Employee 的實體對象. * 3. 查詢結(jié)果中可能會包含重復(fù)元素, 可以通過一個 HashSet 來過濾重復(fù)元素 * * 去重: * 方法一:使用 distinct * String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN FETCH d.emps "; * Query query = session.createQuery(hql); * * List<Department> depts = query.list(); * System.out.println(depts.size()); * * 方法二 * String hql = "FROM Department d LEFT JOIN FETCH d.emps "; * Query query = session.createQuery(hql); * * List<Department> depts = query.list(); * * depts = new ArrayList<>(new LinkedHashSet(depts)); * System.out.println(depts.size()); * * for(Department dept:depts){ * System.out.println(dept.getName() + "--" + dept.getEmps().size() ); * } * * */ @Test public void testLeftJoinFetch(){ // String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN FETCH d.emps "; // Query query = session.createQuery(hql); // // List<Department> depts = query.list(); // System.out.println(depts.size()); // String hql = "FROM Department d LEFT JOIN FETCH d.emps "; Query query = session.createQuery(hql); List<Department> depts = query.list(); System.out.println(depts.size()); depts = new ArrayList<>(new LinkedHashSet(depts)); System.out.println(depts.size()); for (Department dept:depts){ System.out.println(dept.getName() + "--" + dept.getEmps().size() ); } } /** * 左外連接: * 1. LEFT JOIN 關(guān)鍵字表示左外連接查詢. * 2. list() 方法返回的集合中存放的是對象數(shù)組類型 * 3. 根據(jù)配置文件來決定 Employee 集合的檢索策略. * 4. 如果希望 list() 方法返回的集合中僅包含 Department 對象, * 可以在HQL 查詢語句中使用 SELECT 關(guān)鍵字 * * 這樣的語句查詢的結(jié)果有重復(fù): * String hql = "FROM Department d LEFT JOIN d.emps"; * Query query = session.createQuery(hql); * * List<Object[]> results = query.list(); * System.out.println(results.size()); * * 去重: * 僅能使用 distinct 的方法去除重復(fù) * * String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN d.emps"; * Query query = session.createQuery(hql); * * List<Department> depts = query.list(); * System.out.println(depts.size()); * * for(Department dept:depts){ * System.out.println(dept.getName() + dept.getEmps().size()); * } * */ @Test public void testLeftJoin(){ String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN d.emps"; Query query = session.createQuery(hql); List<Department> depts = query.list(); System.out.println(depts.size()); for (Department dept:depts){ System.out.println(dept.getName() + dept.getEmps().size()); } } /** * 迫切內(nèi)連接: 特點是:不返回左表不滿足條件 * INNER JOIN FETCH 關(guān)鍵字表示迫切內(nèi)連接, 也可以省略 INNER 關(guān)鍵字 * list() 方法返回的集合中存放 Department 對象的引用, 每個 Department * 對象的 Employee 集合都被初始化, 存放所有關(guān)聯(lián)的 Employee 對象 * * 內(nèi)連接: * INNER JOIN 關(guān)鍵字表示內(nèi)連接, 也可以省略 INNER 關(guān)鍵字 * list() 方法的集合中存放的每個元素對應(yīng)查詢結(jié)果的一條記錄, 每個元素都是對象數(shù)組類型 * 如果希望 list() 方法的返回的集合僅包含 Department 對象, 可以在 HQL 查詢語句中使用 SELECT 關(guān)鍵字 * * * */ @Test public void testInnerJoinFetch(){ //String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN FETCH d.emps "; String hql = "FROM Department d INNER JOIN FETCH d.emps "; Query query = session.createQuery(hql); List<Department> depts = query.list(); depts = new ArrayList<>(new LinkedHashSet(depts)); System.out.println(depts.size()); for (Department dept:depts){ System.out.println(dept.getName() + "--" + dept.getEmps().size() ); } } // ~~~~~~~~~~~~~~~~~~~~~~~~~~下面的例子是 從多 對 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @Test public void testLeftJoinFetch2(){ String hql = "FROM Employee e LEFT JOIN FETCH e.dept"; Query query = session.createQuery(hql); List<Employee> emps = query.list(); System.out.println(emps.size()); for (Employee emp:emps){ System.out.println(emp + " -- " + emp.getDept()); } } }
總結(jié)
以上就是本文關(guān)于Hibernate迫切連接和普通連接的區(qū)別實例詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
淺談hibernate急迫加載問題(多重外鍵關(guān)聯(lián))
如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
Java 如何將前端傳來的數(shù)字轉(zhuǎn)化為日期
這篇文章主要介紹了Java 如何將前端傳來的數(shù)字轉(zhuǎn)化為日期,本文通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-06-06JAVA中堆、棧,靜態(tài)方法和非靜態(tài)方法的速度問題
這篇文章主要介紹了JAVA中堆、棧,靜態(tài)方法和非靜態(tài)方法的速度問題,堆和棧得速度性能分析多角度給大家分析,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08