day37 hql語(yǔ)法

------------------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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容