------------------hql語(yǔ)法
- 基礎(chǔ)
String hql = " from cn.itcast.domain.Customer ";//完整寫(xiě)法
String hql2 = " from Customer "; //簡(jiǎn)單寫(xiě)法
String hql3 = " from java.lang.Object ";
Query query = session.createQuery(hql3);
List list = query.list();
- 排序
String hql1 = " from cn.itcast.domain.Customer order by cust_id asc ";//完整寫(xiě)法
String hql2 = " from cn.itcast.domain.Customer order by cust_id desc ";//完整寫(xiě)法
Query query = session.createQuery(hql2);
List list = query.list();
- 條件
String hql1 = " from cn.itcast.domain.Customer where cust_id =? ";//完整寫(xiě)法
String hql2 = " from cn.itcast.domain.Customer where cust_id = :id ";//完整寫(xiě)法
Query query = session.createQuery(hql2);
// query.setParameter(0, 2l);
query.setParameter("id", 2l);
List list = query.list();
- 分頁(yè)
String hql1 = " from cn.itcast.domain.Customer ";//完整寫(xiě)法
Query query = session.createQuery(hql1);
//limit ?,?
// (當(dāng)前頁(yè)數(shù)-1)*每頁(yè)條數(shù)
query.setFirstResult(2);
query.setMaxResults(2);
List list = query.list();
- 聚合
String hql1 = " select count(*) from cn.itcast.domain.Customer ";//完整寫(xiě)法
String hql2 = " select sum(cust_id) from cn.itcast.domain.Customer ";//完整寫(xiě)法
String hql3 = " select avg(cust_id) from cn.itcast.domain.Customer ";//完整寫(xiě)法
String hql4 = " select max(cust_id) from cn.itcast.domain.Customer ";//完整寫(xiě)法
String hql5 = " select min(cust_id) from cn.itcast.domain.Customer ";//完整寫(xiě)法
Query query = session.createQuery(hql5);
Number number = (Number) query.uniqueResult();
- 投影
String hql1 = " select cust_name from cn.itcast.domain.Customer ";
String hql2 = " select cust_name,cust_id from cn.itcast.domain.Customer ";
String hql3 = " select new Customer(cust_id,cust_name) from cn.itcast.domain.Customer ";
Query query = session.createQuery(hql3);
List list = query.list();
- 多表查詢
//回顧-原生SQL
// 交叉連接-笛卡爾積(避免)
// select * from A,B
// 內(nèi)連接
// |-隱式內(nèi)連接
// select * from A,B where b.aid = a.id
// |-顯式內(nèi)連接
// select * from A inner join B on b.aid = a.id
// 外連接
// |- 左外
// select * from A left [outer] join B on b.aid = a.id
// |- 右外
// select * from A right [outer] join B on b.aid = a.id
//HQL的多表查詢
//內(nèi)連接(迫切)
//外連接
// |-左外(迫切)
// |-右外(迫切)
- hql多表語(yǔ)法
//HQL 內(nèi)連接 => 將連接的兩端對(duì)象分別返回.放到數(shù)組中.
String hql = " from Customer c inner join c.linkMens ";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for(Object[] arr : list){
System.out.println(Arrays.toString(arr));
}
//HQL 迫切內(nèi)連接 => 幫我們進(jìn)行封裝.返回值就是一個(gè)對(duì)象
String hql = " from Customer c inner join fetch c.linkMens ";
Query query = session.createQuery(hql);
List<Customer> list = query.list();
//HQL 左外連接 => 將連接的兩端對(duì)象分別返回.放到數(shù)組中.
String hql = " from Customer c left join c.linkMens ";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
//HQL 右外連接 => 將連接的兩端對(duì)象分別返回.放到數(shù)組中.
String hql = " from Customer c right join c.linkMens ";
-------------------criteria
- 基本
Criteria c = session.createCriteria(Customer.class);
List<Customer> list = c.list();
- 條件
Criteria c = session.createCriteria(Customer.class);
// c.add(Restrictions.idEq(2l));
c.add(Restrictions.eq("cust_id",2l));
List<Customer> list = c.list();
- 分頁(yè)
Criteria c = session.createCriteria(Customer.class);
//limit ?,?
c.setFirstResult(0);
c.setMaxResults(2);
List<Customer> list = c.list();
- 排序
Criteria c = session.createCriteria(Customer.class);
c.addOrder(Order.asc("cust_id"));
//c.addOrder(Order.desc("cust_id"));
List<Customer> list = c.list();
- 統(tǒng)計(jì)
Criteria c = session.createCriteria(Customer.class);
//設(shè)置查詢目標(biāo)
c.setProjection(Projections.rowCount());
List list = c.list();
----------------離線與非離線區(qū)別在于是否是有session創(chuàng)建的criteria
@Test
public void fun1(){
//Service/web層
DetachedCriteria dc = DetachedCriteria.forClass(Customer.class);
dc.add(Restrictions.idEq(6l));//拼裝條件(全部與普通Criteria一致)
//----------------------------------------------------
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//----------------------------------------------------
Criteria c = dc.getExecutableCriteria(session);
List list = c.list();
System.out.println(list);
//----------------------------------------------------
tx.commit();
session.close();
}
----------------查詢優(yōu)化
- 類級(jí)別優(yōu)化是使用代理方式使之實(shí)體對(duì)象可以在使用時(shí)候才進(jìn)行查詢操作(類似將connection類的close方法重寫(xiě))
- get方法:沒(méi)有任何策略.調(diào)用即立即查詢數(shù)據(jù)庫(kù)加載數(shù)據(jù).
- load方法: 應(yīng)用類級(jí)別的加載策略
// load方法(默認(rèn)):是在執(zhí)行時(shí),不發(fā)送任何sql語(yǔ)句.返回一個(gè)對(duì)象.使用該對(duì)象時(shí),才執(zhí)行查詢.
// 延遲加載: 僅僅獲得沒(méi)有使用.不會(huì)查詢.在使用時(shí)才進(jìn)行查詢.
// 是否對(duì)類進(jìn)行延遲加載: 可以通過(guò)在class元素上配置lazy屬性來(lái)控制.
//lazy:true 加載時(shí),不查詢.使用時(shí)才查詢b
//lazy:false 加載時(shí)立即查詢.
--------
<class name="Customer" table="cst_customer" lazy="false" >
-------------
Customer c = session.load(Customer.class, 2l);
- 集合策略
<!--
lazy屬性: 決定是否延遲加載
true(默認(rèn)值): 延遲加載,懶加載
false: 立即加載
extra: 極其懶惰
fetch屬性: 決定加載策略.使用什么類型的sql語(yǔ)句加載集合數(shù)據(jù)
select(默認(rèn)值): 單表查詢加載
join: 使用多表查詢加載集合
subselect:使用子查詢加載集合
-->
<!-- batch-size: 抓取集合的數(shù)量為3.
抓取客戶的集合時(shí),一次抓取幾個(gè)客戶的聯(lián)系人集合.
-->
<set name="linkMens" batch-size="3" >
<key column="lkm_cust_id" ></key>
<one-to-many class="LinkMan" />
</set>
- 關(guān)聯(lián)屬性策略
<!--
fetch 決定加載的sql語(yǔ)句
select: 使用單表查詢
join : 多表查詢
lazy 決定加載時(shí)機(jī)
false: 立即加載
proxy: 由customer的類級(jí)別加載策略決定.
-->
- 結(jié)論:為了提高效率.fetch的選擇上應(yīng)選擇select. lazy的取值應(yīng)選擇 true. 全部使用默認(rèn)值.
-
no-session問(wèn)題解決: 擴(kuò)大session的作用范圍.
image.png
