国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

Hibernate迫切連接和普通連接的區別實例詳解

2024-07-13 10:15:14
字體:
來源:轉載
供稿:網友

Hibernate 迫切連接和普通連接的區別

相關的介紹和解釋在代碼中已注釋,大家可以參考。

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 關鍵字表示迫切左外連接檢索策略.   *    2. list() 方法返回的集合中存放實體對象的引用, 每個 Department 對象關聯的 Employee 集合都被初始化,   *       存放所有關聯的 Employee 的實體對象.   *    3. 查詢結果中可能會包含重復元素, 可以通過一個 HashSet 來過濾重復元素   *   *     去重:   *       方法一:使用 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 關鍵字表示左外連接查詢.   *    2. list() 方法返回的集合中存放的是對象數組類型   *    3. 根據配置文件來決定 Employee 集合的檢索策略.   *    4. 如果希望 list() 方法返回的集合中僅包含 Department 對象,   *      可以在HQL 查詢語句中使用 SELECT 關鍵字   *       *    這樣的語句查詢的結果有重復:   *      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 的方法去除重復   *      *       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());		}	}	/**   * 迫切內連接: 特點是:不返回左表不滿足條件   *    INNER JOIN FETCH 關鍵字表示迫切內連接, 也可以省略 INNER 關鍵字   *    list() 方法返回的集合中存放 Department 對象的引用, 每個 Department   *        對象的 Employee 集合都被初始化, 存放所有關聯的 Employee 對象   *   * 內連接:   *    INNER JOIN 關鍵字表示內連接, 也可以省略 INNER 關鍵字   *    list() 方法的集合中存放的每個元素對應查詢結果的一條記錄, 每個元素都是對象數組類型   *    如果希望 list() 方法的返回的集合僅包含 Department 對象, 可以在 HQL 查詢語句中使用 SELECT 關鍵字   *   *   *   */	@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());		}	}}

總結

以上就是本文關于Hibernate迫切連接和普通連接的區別實例詳解的全部內容,希望對大家有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江安县| 扎兰屯市| 常德市| 五台县| 鹤岗市| 禹城市| 白朗县| 芜湖市| 岱山县| 大厂| 凌源市| 淅川县| 彭泽县| 衡阳县| 吴旗县| 隆化县| 山西省| 象州县| 微山县| 顺平县| 永登县| 金门县| 屯门区| 东莞市| 黎城县| 朔州市| 深圳市| 托克逊县| 新密市| 璧山县| 遵化市| 西乌珠穆沁旗| 龙川县| 武山县| 济南市| 桑植县| 伊吾县| 连州市| 神木县| 阿城市| 泸定县|