1. 程式人生 > >迫切左外連線、 左外連線、 迫切內連線、 內連線

迫切左外連線、 左外連線、 迫切內連線、 內連線

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());
		}
		
	}
}


相關推薦

迫切連線 連線 迫切連線 連線

package com.baidu.test; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import org.hibernate.Qu

資料庫的連線連線連線,全連線

Students表和Advisors表 一、內連線 按照Advistor_ID進行表的合併,合併後的資料只有兩個表中Advistor_ID都有的值,對應的行    二、左外連線 按照Advistor_ID進行的左外連接合並,保證表Students中Advistor_ID的

MySQL之內連線()連線右()連線詳解

用兩個表(a_table、b_table),關聯欄位a_table.a_id和b_table.b_id來操作一下內連線,左(外)連線,右(外)連線。 MySQL:Navicat 資料庫表:a_table、b_table 主題:內連線、左連線(左外連線)、右連線(右外連線) 建表語句:

SQL的四種連線-連線連線連線連線

聯接條件可在FROM或WHERE子句中指定,建議在FROM子句中指定聯接條件。WHERE和HAVING子句也可以包含搜尋條件,以進一步篩選聯接條件所選的行。     聯接可分為以下幾類:     1、內聯接(典型的聯接運算,使用像 =  或 <> 之類的比較運算

資料庫中連線連線連線連線連線交叉連線的區別

內連線: 內聯接使用比較運算子根據每個表共有的列的值匹配兩個表中的行。利用內連線可獲取兩表的公共部分的記錄。 又細分為三種: 等值連線: 在連線條件中使用等於號(=)運算子比較被連線列的列值,其查詢結果中列出被連線表中的所有列,包括其中的重複列。 不等值連線: 在

圖解MySQL 連線連線連線連線連線

用兩個表(a_table、b_table),關聯欄位a_table.a_id和b_table.b_id來演示一下MySQL的內連線、外連線( 左(外)連線、右(外)連線、全(外)連線)。 MySQL版本:Server version: 5.6.31 MySQ

圖解MySQL 連線連線連線連線連線……太多了

用兩個表(a_table、b_table),關聯欄位a_table.a_id和b_table.b_id來演示一下MySQL的內連線、外連線( 左(外)連線、右(外)連線、全(外)連線)。 MySQL版本:Server version: 5.6.31 MySQL

深入理解SQL的四種連線-連線連線連線連線

1、內聯接(典型的聯接運算,使用像 = 或 <> 之類的比較運算子)。包括相等聯接和自然聯接。 內聯接使用比較運算子根據每個表共有的列的值匹配兩個表中的行。例如,檢索 students和courses表中學生標識號相同的所有行。 2、外聯接。外聯接

多表查詢,連線(隱式顯示),連線基礎表)

from子句進行多表查詢 例如:查詢分數資訊,顯示玩家暱稱、遊戲名稱和分數 select user_name as '暱稱', gname as '遊戲名稱', score as '分數'

10Oracle:連線連線連線以及(+)號用法

回到目錄 1、準備工作 Oracle  外連線(OUTER JOIN)包括以下: 左外連線(左邊的表不加限制)右外連線(右邊的表不加限制)全外連線(左右兩表都不加限制) 對應SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常省略OUTER關鍵字,

詳解SQL的四種連線-連線連線連線連線

1、內聯接(典型的聯接運算,使用像 =  或 <> 之類的比較運算子)。包括相等聯接和自然聯接。      內聯接使用比較運算子根據每個表共有的列的值匹配兩個表中的行。例如,檢索 students和courses表中學生標識號相同的所有行。        2、

連線連線連線交叉連線及其區別

首先建立兩張表A、B。 表A: Aid:int型別,無符號遞增,主鍵 name:varchar型別 表B: Bid:int型別,無符號遞增,主鍵 name:varchar型別 age:int型

oracle連線連線完全連線以及(+)號用法

準備工作 oracle連線分為: 左外連線:左表不加限制,保留左表的資料,匹配右表,右表沒有匹配到的行中的列顯示為null。右外連線:右表不加限制,保留右表的資料。匹配左表,左表沒有匹配到的行中列顯

連線連線連線連線交叉連線(CROSS JOIN)-----小知識解決大資料攻略

       早就聽說了內連線與外連線,以前檢視中使用過、這次自考也學習了,只是簡單理解,現在深入探究學習(由於上篇部落格的出現)與實踐: 概念 關鍵字: 左右連線 資料表的連線有: 1、內連線(

【技術篇】SQL的四種連線-連線連線連線連線

聯接條件可在FROM或WHERE子句中指定,建議在FROM子句中指定聯接條件。WHERE和HAVING子句也可以包含搜尋條件,以進一步篩選聯接條件所選的行。     聯接可分為以下幾類:     1、內聯接(典型的聯接運算,使用像 =  或 <> 之類的比較運算子)。包括相等聯接和自然聯接。  

LINQ使用連線(1連線 2連線 3連線 4交叉連線

首先呢,今天在資料庫中寫好了笛卡爾連線,後面要改寫成LINQ的方式。突然瞬間蒙了,寫多了JOIN卻忘了怎麼去寫交叉連線(笛卡爾連線)。 順便複習一下LINQ的連線操作: static public class SampleData { static

SQL語句中的連線連線交叉連線連線

第一部分、連線查詢一、內連線內連線查詢操作列出與連線條件匹配的資料行,它使用比較運算子比較被連線列的列值。內連線分三種:1、等值連線:在連線條件中使用等於號(=)運算子比較被連線列的列值,其查詢結果中列出被連線表中的所有列,包括其中的重複列。2、不等連線:在連線條件使用除等於運算子以外的其它比較運算子比較被連

連線連線 TOTO 一對一 一對多 結果不一樣的

1. 簡介 2. 建表 A表 B表 注: B表的parent_id對應A表的id 3. 測試 3.1 顯式內連線 -- 顯示內連線 SELECT A.*, B.* FROM A INNER JOIN B ON A.id = B.parent_i

Oracle連線連線連線以及(+)號用法

回到目錄 1、準備工作 Oracle  外連線(OUTER JOIN)包括以下: 左外連線(左邊的表不加限制)右外連線(右邊的表不加限制)全外連線(左右兩表都不加限制) 對應SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常省略OUTER關鍵字, 寫成:LEFT/RIGHT/FULL

連線連線連線交叉連線區別

http://blog.csdn.net/cnham/archive/2008/06/25/2584936.aspx  在之前,我對MSSQL中的內連線和外連線所得出的資料集不是很清楚。這幾天重新溫習了一下SQL的書本,現在的思路應該是很清楚了,現在把自己的理解發出來給大家溫習下。希望和我一樣對SQL的連線