1. 程式人生 > >Hibernate中的各種查詢(物件導航、OID、hql、QBC、本地SQL、多表)

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