1. 程式人生 > >Hibernate_day04---HQL查詢、QBC查詢、多表查詢、檢索策略、批量抓取

Hibernate_day04---HQL查詢、QBC查詢、多表查詢、檢索策略、批量抓取

一、Hibernate查詢方式及結果存放


查詢方式(五種)
	1)物件導航查詢 :一對多中,查詢某個"一"對應的所有"多"
	2)OID查詢: 根據id查詢某一條記錄,返回物件
	3)HQL查詢: 使用Query物件,內建hql語句實現查詢。
	4)QBC查詢:使用Criteria物件		
	5)本地sql查詢:SQLQuery物件,使用普通sql實現查詢

查詢結果的存放
	1)查詢結果為:多個類物件:List<類名>   使用.list()方法
	2)查詢結果為:多個類屬性:List<Object>  使用.list()方法
	3)查詢結果為:單個結果:Object   使用.uniqueResult()方法

二、HQL查詢與QBC查詢詳解:


HQL查詢

  使用Query物件,內建hql語句實現查詢。
  
  與SQL區別:普通sql操作資料庫表和欄位,hql操作實體類和屬性

(1)查詢所有
	hql語法:from 實體類名稱
	
	步驟:
	1.建立 Query物件,初始化hql語句(from 實體類名稱)
	2.呼叫list方法得到結果
	3.遍歷輸出結果
		//1.建立 Query物件,初始化hql語句
		Query query = session.createQuery("from Customer");
		
		//2.呼叫list方法得到結果
		List<Customer> list = query.list();
		
		//3.遍歷輸出結果
		for (Customer customer : list) {
			System.out.println(customer.getCid() +": "+ customer.getCustName());
		}

(2)條件查詢

	步驟:
	1.建立 Query物件,初始化hql語句(設定條件引數)
	2.設定條件值  setParameter(?位置,引數值)
	3.呼叫list方法得到結果
		//1.建立 Query物件,初始化hql語句(設定條件引數)
		Query query = session.createQuery("from Customer c WHERE c.cid = ? AND c.custName = ?");
		
		//2.設定條件值  setParameter(?位置,引數值)
		query.setParameter(0, 1);
		query.setParameter(1, "百度");
		
		//3.呼叫list方法得到結果
		List<Customer> list = query.list();
		
	模糊條件查詢示例
		//1.建立 Query物件,初始化hql語句(設定條件引數)
		Query query = session.createQuery("from Customer c WHERE c.custName like ?");
		
		//2.設定條件值  setParameter(?位置,引數值)
		query.setParameter(0, "%百%");
		
	
(3)排序查詢
	
	hql語法:from 實體類名稱 ORDER BY 屬性名 ASC/DESC
	
		//1.建立 Query物件,初始化hql語句(設定升/降序)
		Query query = session.createQuery("from Customer ORDER BY cid DESC");
		
		//2.呼叫list方法得到結果
		List<Customer> list = query.list();

(4)分頁查詢
	**需要設定開始位置、每頁記錄數
		//1.建立 Query物件,初始化hql語句
		Query query = session.createQuery("from Customer");
		
		//2.設定開始位置、每頁記錄數
		query.setFirstResult(0);  //設定起始位置為0
		query.setMaxResults(2);	 //設定每頁記錄數為2
		
		//3.呼叫list方法得到結果
		List<Customer> list = query.list();

(5)投影查詢(只查詢指定欄位的值)
		hql語法:select 類屬性名 from 類名
		結果使用Object接收
		
		//1.建立 Query物件,初始化hql語句
		Query query = session.createQuery("select custName from Customer");
		
		//2.呼叫list方法得到結果
		List<Object> list = query.list();
		
		//3.遍歷輸出結果
		for (Object object : list) {
			System.out.println(object);
		}
		
(6)聚集函式使用
	常用的聚集函式:count(統計)、sum(求和)、avg(求平均)、max(求最大)、min(求最小)、
	 
	 hql語句:select count(*) from 實體類名稱
	 
		//1.建立 Query物件,初始化hql語句
		Query query = session.createQuery("select count(*) from Customer");
		
		//2.呼叫unique方法得到結果
		Object obj = query.uniqueResult();
 
 
	注:Object不能直接轉換成Int型別! 需要先轉化為Long,再由Long轉換為Int

QBC查詢

核心操作:
	1.使用Criteria物件中的方法查詢、2.操作實體類和屬性、3.不需要寫查詢語句

 (1)查詢所有
		//1.建立 Criteria物件.
		Criteria criteria = session.createCriteria(Customer.class);
		
		//2.呼叫list方法得到結果
		List<Customer> list = criteria.list();	
 
 (2)條件查詢
	方法: criteria.add(Restrictions.eq("條件欄位名",條件值));
	
		//1.建立 Criteria物件.
		Criteria criteria = session.createCriteria(Customer.class);
		
		//2.使用方法設定條件及條件值
		criteria.add(Restrictions.eq("cid", 1));
		criteria.add(Restrictions.eq("custName", "百度"));
		
		//模糊查詢
		//criteria.add(Restrictions.like("custName", "%百%"));
		
		//3.呼叫list方法得到結果
		List<Customer> list = criteria.list();	
		
 (3)排序查詢
		//1.建立 Criteria物件.
		Criteria criteria = session.createCriteria(Customer.class);
		
		//2.設定排序規則,設定排序引數
		criteria.addOrder(Order.asc("cid"));  //升序
		criteria.addOrder(Order.desc("cid"));  //降序

		//3.呼叫list方法得到結果
		List<Customer> list = criteria.list();	
	
 (4)分頁查詢
		//1.建立 Criteria物件.
		Criteria criteria = session.createCriteria(Customer.class);
		
		//2.設定分頁資料(開始位置、每頁記錄數)
		criteria.setFirstResult(0);  //設定開始位置
		criteria.setMaxResults(3);  //設定每頁記錄數
		
		//3.呼叫list方法得到結果
		List<Customer> list = criteria.list();	
		
 (5)統計查詢
	
		//1.建立 Criteria物件.
		Criteria criteria = session.createCriteria(Customer.class);
		
		//2.設定統計行操作
		criteria.setProjection(Projections.rowCount());
		
		//3.查詢
		Object obj = criteria.uniqueResult();
 
 (6)離線查詢 
		實現基本:跳過session直接建立Criteria
		作用:可在servlet中傳入查詢條件
		
		//1.使用DetachedCriteria類,離線建立 Criteria物件.
		DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
		
			
		//2.最終執行時再傳入session
		Criteria criteria = detachedCriteria.getExecutableCriteria(session);
		
		//3.執行查詢
		List<Customer> list = criteria.list();

三、多表查詢


Mysql多表查詢:

(1)內連線:只查詢顯示兩表中關聯的資料
(2)左外連線:左邊表全部顯示,右邊表只查詢顯示關聯資料
(3)右外連線:右邊表全部顯示,左邊表只查詢顯示關聯資料

在這裡插入圖片描述

Hql多表查詢:

(1)內連線 與 迫切內連線 
	   
	 相同點:語法相同,底層實現相同。
	 不同點:
		HQL語句不同:
			內連線:from  實體類   別名 inner  join   別名.另一個表
			迫切內連線: from 實體類 別名 inner join fetch 別名.另一個表
		結果不同:
			內連線:返回為 陣列形式
			迫切內連線:返回為 物件形式
		   			
(2)左外連線 和 迫切左外連線
	相同點:語法相同,底層實現相同。
	不同點:
		HQL語句不同:
			內連線:from  實體類   別名 left outer  join   別名.另一個表
			迫切內連線: from 實體類 別名 left outer join fetch 別名.另一個表
		結果不同:
			內連線:返回為 陣列形式
			迫切內連線:返回為 物件形式	

(3)右外連線
	 HQL語句:from 實體類 別名 right outer join 別名.另一個表
	 
	 注:不存在迫切右外連線!

四、hibernate檢索策略


檢索策略分為兩類:
	1)立即查詢:呼叫get方法(根據id查詢)。
			get方法被呼叫會馬上傳送語句查詢資料庫
	2)延遲查詢:
			延遲:是查詢語句向資料庫傳送時機的延遲。
			做法:呼叫load查詢(根據id查詢)。
			
			load方法需要在具體執行時(得到物件屬性值時)才會傳送語句查詢資料庫。
			
	   延遲類別(兩種):
			1)類級別延遲:得到物件屬性值之前的延遲。
			2)關聯級別延遲(預設)。
				背景:先查詢某個客戶,再查詢客戶中所有聯絡人
				延遲處於:查詢客戶之後,查詢客戶聯絡人之前的延遲

五、批量抓取


應用場景:當我們想獲取全部的商品類別,然後在獲取所有類別下面的商品時。

問題:每次查詢類別時,都會發送語句。

解決:設定每條語句抓取採集的資料數目。

使用方法:在客戶的對映檔案中,配置set標籤屬性 -- batch-size值(值越大發送語句越少)

附錄:
1)檢索策略
在這裡插入圖片描述
2)QBC查詢方法
在這裡插入圖片描述