迫切左外連線、 左外連線、 迫切內連線、 內連線
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 '分數'
10、Oracle:左連線、右連線、全外連線以及(+)號用法
回到目錄 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的連線