Hibernate迫切連接和普通連接的區(qū)別實(shí)例詳解
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 對 多 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
*
* 迫切左外連接: 特點(diǎn)是:如果左表有不滿足條件的,也返回左表不滿足條件
* 1. LEFT JOIN FETCH 關(guān)鍵字表示迫切左外連接檢索策略.
* 2. list() 方法返回的集合中存放實(shí)體對象的引用, 每個(gè) Department 對象關(guān)聯(lián)的 Employee 集合都被初始化,
* 存放所有關(guān)聯(lián)的 Employee 的實(shí)體對象.
* 3. 查詢結(jié)果中可能會包含重復(fù)元素, 可以通過一個(gè) 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)連接: 特點(diǎn)是:不返回左表不滿足條件
* INNER JOIN FETCH 關(guān)鍵字表示迫切內(nèi)連接, 也可以省略 INNER 關(guān)鍵字
* list() 方法返回的集合中存放 Department 對象的引用, 每個(gè) Department
* 對象的 Employee 集合都被初始化, 存放所有關(guān)聯(lián)的 Employee 對象
*
* 內(nèi)連接:
* INNER JOIN 關(guān)鍵字表示內(nèi)連接, 也可以省略 INNER 關(guān)鍵字
* list() 方法的集合中存放的每個(gè)元素對應(yīng)查詢結(jié)果的一條記錄, 每個(gè)元素都是對象數(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ū)別實(shí)例詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
淺談hibernate急迫加載問題(多重外鍵關(guān)聯(lián))
如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
Java concurrency之鎖_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java concurrency之鎖的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Springboot實(shí)現(xiàn)自定義錯誤頁面的方法(錯誤處理機(jī)制)
這篇文章主要介紹了Springboot實(shí)現(xiàn)自定義錯誤頁面的方法(錯誤處理機(jī)制),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
SpringMVC攔截器實(shí)現(xiàn)登錄認(rèn)證
這篇文章主要介紹了SpringMVC攔截器實(shí)現(xiàn)登錄認(rèn)證的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
vue+springboot前后端分離工程跨域問題解決方案解析
這篇文章主要介紹了vue+springboot前后端分離工程跨域問題解決方案解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
MyBatis-Plus攔截器對敏感數(shù)據(jù)實(shí)現(xiàn)加密
做課程項(xiàng)目petstore時(shí)遇到需要加密屬性的問題,而MyBatis-Plus為開發(fā)者提供了攔截器的相關(guān)接口,本文主要介紹通過MyBatis-Plus的攔截器接口自定義一個(gè)攔截器類實(shí)現(xiàn)敏感數(shù)據(jù)如用戶密碼的加密功能,感興趣的可以了解一下2021-11-11
Sentinel網(wǎng)關(guān)限流與SpringCloud Gateway整合過程
本文介紹了如何通過SpringCloudGateway集成阿里的Sentinel進(jìn)行網(wǎng)關(guān)限流,Sentinel作為流量防衛(wèi)兵,提供了豐富的應(yīng)用場景和完備的實(shí)時(shí)監(jiān)控功能,通過配置路由維度和自定義API維度的限流規(guī)則,實(shí)現(xiàn)了對微服務(wù)的保護(hù)2024-11-11
IDEA+Maven搭建Spring環(huán)境的詳細(xì)教程
這篇文章主要介紹了IDEA+Maven搭建Spring環(huán)境的詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11

