Hibernate中的各種查詢(物件導航、OID、hql、QBC、本地SQL、多表)
Hibernate中的查詢方式
1、物件導航查詢
(1)根據id查詢某個客戶(Customer),然後再查詢這個客戶中的所有聯絡人(Linkman)
//查詢id為1的客戶以及這個客戶中的所有聯絡人
Customer c1 = session.get(Customer.class, 1);
//得到這個客戶的set集合
Set<LinkMan> linkman = c1.getSetLinkMan();
2、OID查詢
(1)根據id查詢某一條記錄,返回物件
session.get();
3、hql查詢 hibernate query language
普通sql操作的是資料庫表中的表明和欄位,hql操作的是實體類和它的屬性
(1)建立Query物件,寫hql語句實現查詢
- 查詢所有:from 實體類名稱
//查詢所有 查詢客戶表中的所有記錄
Query query = session.createQuery("from Customer");
List<Customer> list = query.list();
- 條件查詢
寫法:from 實體類名稱 where 實體類屬性名稱=? and 實體類屬性名稱=?
//用hql查詢,第一步都要建立query物件 Query query = session.createQuery("from Customer where cid=?0 and custName=?1"); //設定條件值,位置從0開始 query.setParameter(0, 1); query.setParameter(1, "湖北");
from 實體類名稱 where 實體類屬性名稱 like
Query query = session.createQuery("from Customer where custName like ?0");
query.setParameter(0, "湖%");
- 排序查詢
寫法:from 實體類名稱 order by 實體類屬性名稱 asc/desc
//排序查詢 Query query = session.createQuery("from Customer order by cid desc");
- 分頁查詢
-- mysql實現分頁,使用關鍵字limit
-- hql實現分頁,hql語句中不能用limit,hibernate中query物件封裝了兩個方法實現
//分頁查詢
//查詢所有
Query query = session.createQuery("from Customer");
//設定分頁引數
//設定查詢開始位置
query.setFirstResult(0);
//設定每頁顯示的記錄條數
query.setMaxResults(4);
- 投影查詢 查詢部分欄位的資料
-- select 實體類屬性名稱 from 實體類名稱
-- select 後面不能用*
//投影查詢
Query query = session.createQuery("select custName from Customer");
List<Object> list = query.list();
for(Object c:list){
System.out.println(c);
}
注意此時list中裝的不再是Customer物件,而是Object物件,查詢出的是欄位名,不是物件
- 聚集函式的使用
-- 常用聚集函式:count、sum、avg、max、min
-- hql語句:select count(*) from 實體類名稱
//聚集函式的使用
Query query = session.createQuery("select count(*) from Customer");
System.out.println(((Long)query.uniqueResult()).intValue());
query.uniqueResult()本身返回的是Long型別,要經過強轉然後intValue()後才變為int型別
4、QBC查詢
hql查詢需要寫hql語句實現,但是使用QBC不需要寫語句,直接使用方法實現
使用QBC操作實體類和屬性
使用Criteria物件
- 查詢所有
(1)建立Criteria物件然後呼叫方法進行查詢
//查詢所有
//建立Criteria物件
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();
- 條件查詢
//條件查詢
//建立Criteria物件
Criteria criteria = session.createCriteria(Customer.class);
//使用criteria物件的方法設定要查詢的條件值
//使用add方法中的Restrictions物件設定查詢條件
criteria.add(Restrictions.eq("cid", 1));
List<Customer> list = criteria.list();
- 排序查詢
//排序查詢
//建立Criteria物件
Criteria criteria = session.createCriteria(Customer.class);
//設定對哪個屬性進行排序以及排序規則
criteria.addOrder(Order.desc("cid"));
- 分頁查詢
//分頁查詢
//建立Criteria物件
Criteria criteria = session.createCriteria(Customer.class);
//設定分頁資料
//設定開始位置
criteria.setFirstResult(1);
//設定每頁的記錄數
criteria.setMaxResults(4);
分頁查詢的開始位置計算公式:(當前頁 - 1)* 每頁記錄數
- 統計查詢
-- 得到表中的記錄數
//統計查詢
//建立Criteria物件
Criteria criteria = session.createCriteria(Customer.class);
//設定操作
criteria.setProjection(Projections.rowCount());
Object o = criteria.uniqueResult();
System.out.println(((Long)o).intValue());
- 離線查詢
//離線查詢
//建立離線Criteria物件
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
//最終執行的時候才會用到session
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
5、本地sql查詢
(1)建立SQLQuery物件,寫普通sql語句實現查詢
SQLQuery sqlQuery = session.createSQLQuery();
6、HQL多表查詢
- mysql中的多表查詢
(1)內連線
/* 內連線查詢 */
select * from t_customer t,t_linkman l where t.cid=l.clid
select * from t_customer t INNER JOIN t_linkman l on t.cid=l.clid
(2)左外連線
/* 左外連線查詢 */
select * from t_customer c LEFT JOIN t_linkman l on c.cid=l.clid
(3)右外連線
/* 右外連線查詢 */
select * from t_customer c RIGHT JOIN t_linkman l on c.cid=l.clid
- hql實現多表查詢
(1)內連線
hql語法:from Customer c inner join c.setLinkMan
Query query = session.createQuery("from Customer c inner join c.setLinkMan");
(2)左外連線
hql語法:from Customer c left join c.setLinkMan
(3)右外連線
hql語法:from Customer c right join c.setLinkMan
(4)迫切內連線
-- 迫切內連線底層和內連線是一樣的
-- 區別:內連線返回的list中每部分是一個數組,陣列中包含了Customer和LinkMan物件,迫切內連線返回list的每部分都是物件
hql語法:from Customer c inner join fetch c.setLinkMan
//迫切內連線
Query query = session.createQuery("from Customer c inner join fetch c.setLinkMan");
List<Customer> list = query.list();
list中儲存的是Customer物件
(5)迫切左外連線
hql語法:from Customer c left join fetch c.setLinkMan