Hibernate_day04---HQL查詢、QBC查詢、多表查詢、檢索策略、批量抓取
阿新 • • 發佈:2018-11-03
一、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查詢方法