<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    夢幻之旅

    DEBUG - 天道酬勤

       :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks

    Hibernate檢索對象的方式
    教學內(nèi)容
    HQL檢索方式
    QBC檢索方式
    本地SQL檢索方式

    Hibernate提供的檢索對象的方式
    導航對象圖檢索方式
    根據(jù)已經(jīng)加載的對象,導航到其他對象。例如,對于已經(jīng)加載的Customer對象,調(diào)用它的getOrders().iterator()方法就可以導航到所有關聯(lián)的Order對象,假如在關聯(lián)級別使用了延遲加載檢索策略,那么首次執(zhí)行此方法時,Hibernate會從數(shù)據(jù)庫中加載關聯(lián)的Order對象,否則就從緩存中取得Order對象。
    OID檢索方式
    按照對象的OID來檢索對象。Session的get()和load()方法提供了這種功能。如果在應用程序中事先知道了OID,就可以使用這種檢索對象的方式。
    HQL檢索方式
    使用面向?qū)ο蟮腍QL查詢語言。Session的find()方法用于執(zhí)行HQL查詢語句。此外,Hibernate還提供了Query接口,它是Hibernate提供的專門的HQL查詢接口,能夠執(zhí)行各種復雜的HQL查詢語句。本章有時把HQL檢索方式簡稱為HQL。
    QBC檢索方式
    使用QBC(Query By Criteria)API來檢索對象。這種API封裝了基于字符串形式的查詢語句,提供了更加面向?qū)ο蟮慕涌凇1菊掠袝r把QBC檢索方式簡稱為QBC。
    本地SQL檢索方式
    使用本地數(shù)據(jù)庫的SQL查詢語句。Hibernate會負責把檢索到的JDBC ResultSet結果集映射為持久化對象圖。

    HQL檢索方式
    HQL(Hibernate Query Language)是面向?qū)ο蟮牟樵冋Z言,它和SQL查詢語言有些相似。在Hibernate提供的各種檢索方式中,HQL是使用最廣的一種檢索方式。它具有以下功能:
    在查詢語句中設定各種查詢條件
    支持投影查詢,即僅檢索出對象的部分屬性
    支持分頁查詢
    支持連接查詢
    支持分組查詢,允許使用having和group by關鍵字
    提供內(nèi)置聚集函數(shù),如sum()、min()和max()
    能夠調(diào)用用戶定義的SQL函數(shù)
    支持子查詢,即嵌入式查詢
    支持動態(tài)綁定參數(shù)
    Session的find()方法以及Query接口
    Session類的find()方法以及Query接口都支持HQL檢索方式。
    這兩者的區(qū)別在于,前者只是執(zhí)行一些簡單HQL查詢語句的便捷方法,它不具有動態(tài)綁定參數(shù)的功能,而且在Hibernate3.x版本中,已經(jīng)淘汰了find()方法;而Query接口才是真正的HQL查詢接口,它提供了以上列出的各種查詢功能。
    HQL檢索步驟
     //創(chuàng)建一個Query對象
    Query query=session.createQuery("from Customer as c where "
        +" c.name=:customerName "
        +"and c.age=:customerAge");
    //動態(tài)綁定參數(shù)
    query.setString("customerName","Tom");
    query.setInteger("customerAge",21);
    //執(zhí)行查詢語句,返回查詢結果
    List result= query.list();
    HQL檢索步驟
     (1)通過Session的createQuery()方法創(chuàng)建一個Query對象,它包含一個HQL查詢語句。HQL查詢語句可以包含命名參數(shù),如“customerName”和“customerAge”都是命名參數(shù)。
    (2)動態(tài)綁定參數(shù)。Query接口提供了給各種類型的命名參數(shù)賦值的方法,例如setString()方法用于為字符串類型的customerName命名參數(shù)賦值。
    (3)調(diào)用Query的list()方法執(zhí)行查詢語句。該方法返回List類型的查詢結果,在List集合中存放了符合查詢條件的持久化對象。
    方法鏈編程風格
     List result=session.createQuery("……")
    .setString("customerName","Tom")
    .setInteger("customerAge",21)
    .list(); 
    方法鏈編程風格能使程序代碼更加簡潔。
    QBC檢索方式
    采用HQL檢索方式時,在應用程序中需要定義基于字符串形式的HQL查詢語句。
    QBC API 提供了檢索對象的另一種方式,它主要由Criteria接口、Criterion接口和Expression類組成,它支持在運行時動態(tài)生成查詢語句。
    QBC檢索方式
    //創(chuàng)建一個Criteria對象
    Criteria criteria=session.createCriteria(Customer.class);
    //設定查詢條件,然后把查詢條件加入到Criteria中
    Criterion criterion1= Expression.like("name", "T%") ;
    Criterion criterion2= Expression.eq("age", new Integer(21)) ;
    criteria=criteria.add(criterion1);
    criteria=criteria.add(criterion2);
    //執(zhí)行查詢語句,返回查詢結果
    List result=criteria.list();
    QBC檢索步驟
    (1)調(diào)用Session的createCriteria()方法創(chuàng)建一個Criteria對象。
    (2)設定查詢條件。Expression類提供了一系列用于設定查詢條件的靜態(tài)方法,這些靜態(tài)方法都返回Criterion實例,每個Criterion實例代表一個查詢條件。Criteria的add()方法用于加入查詢條件。
    (3)調(diào)用Criteria的list()方法執(zhí)行查詢語句。該方法返回List類型的查詢結果,在List集合中存放了符合查詢條件的持久化對象。對于以上程序代碼,當運行Criteria的list()方法時,Hibernate執(zhí)行的SQL查詢語句為:
        select * from CUSTOMERS where NAME like 'T%' and AGE=21;

    方法鏈編程風格
    List result=session.createCriteria(Customer.class)
        .add(Expression.like("name", "T%")
        .add(Expression.eq("age", newInteger(21))
        .list();


    比較運算(大于)
    List list = session.createQuery("from Hx c where c.id>0")
    .list();
    List list = session.createCriteria(Hx.class)
    .add(Expression.gt("id", new Integer(0)))
     .list();
    比較運算(不等于)
    List list = session.createQuery("from Hx c where c.id<>0")
    .list();

    List list = session.createCriteria(Hx.class)
    .add(Expression.not(Expression.eq("name", "zmx")))
    .list();
    比較運算(不等)
    List list = session.createQuery("from Hx c where c.name is null")
    .list();
    List list = session.createCriteria(Hx.class)
    .add(Expression.not(Expression.isNull("name")))
    .list();
    比較運算(范圍)
    List list = session.createQuery("from Hx c where c.name in(‘zmx’)")
    .list();
    String names[]={“zmx”,”hx”};
    List list = session.createCriteria(Hx.class)
    .add(Expression.in(“name”,names))
    .list();
    模糊查詢
    List list = session.createQuery("from Hx c where c.name like ‘Z%’")
    .list();
    List list = session.createCriteria(Hx.class)
    .add(Expression.like(“name”,”Z%”)))
    .list();

    QBE查詢(query by Example)
    它是QBC的子功能,允許創(chuàng)建一個對象模板,然后檢索出所有和模板相同的對象,但功能不是很強大,且只支持=和like運算符
       Hx hx = new Hx();
       hx.setAge(33);
       List list = session.createCriteria(Hx.class)
           .add(Example.create(hx)).list();
    查詢排序
    HQL方式
    List list = session.createQuery("from Hx c order by c.name")
                .list();

    QBC方式
    List list = session.createCriteria(Hx.class)
                .add(Expression.like("name","z%"))
                .addOrder(Order.desc("name"))
                .list();
    分頁查詢
     Query和Criteria接口都提供了用于分頁顯示查詢結果的方法:
    setFirstResult(int firstResult):設定從哪一個對象開始檢索,參數(shù)firstResult表示這個對象在查詢結果中的索引位置,索引位置的起始值為0。默認情況下,Query和Criteria接口從查詢結果中的第一個對象,也就是索引位置為0的對象開始檢索。
    setMaxResult(int maxResults):設定一次最多檢索出的對象數(shù)目。默認情況下,Query和Criteria接口檢索出查詢結果中所有的對象。

    分頁查詢
    //采用HQL檢索方式
    Query query = session.createQuery("from   
            Customer c
            order by c.name asc");
    query.setFirstResult(0);
    query.setMaxResults(10);
    List result = query.list();

    //采用QBC檢索方式
    Criteria criteria = session.createCriteria(
                 Customer.class);
    criteria.addOrder(
                  Order.asc("name") );
    criteria.setFirstResult(0);
    criteria.setMaxResults(10);
    List result = criteria.list();

    鏈索查詢
    List list = session.createQuery("from Hx")
                .setFirstResult(0)
                .setMaxResults(2)
                .list();
    List list = session.createCriteria(Hx.class)
                .setFirstResult(0)
                .setMaxResults(2)
                .list();
    檢索單個對象
    Query和Criteria都提供了返回單個對象的方法uniqueResult().
    先調(diào)用setMaxResult(1)方法,把最大檢索數(shù)目設為1,在調(diào)用uniqueResult()方法。

    Hx hx = (Hx)session.createQuery("from Hx")
                .setMaxResults(1)
                .uniqueResult();
    Hx hx = (Hx)session.createCriteria(Hx.class)
             .addOrder(Order.asc("name"))
             .setMaxResults(1)
             .uniqueResult();
    與對象屬性綁定
    Hx hx = new Hx();
    hx.setAge("33");
    List list = session.createQuery("from Hx as c where c.age=:age")
                .setProperties(hx)
                .list();
    SQL內(nèi)連接
    內(nèi)連接就是傳統(tǒng)的連接操作,用join連接關聯(lián)表,on作為連接條件,where指定其他限定條件的查詢
    如:
    select hx.name,hx.age,hxhome.home from hx join hxhome on hx.id=hxhome.hxid
    SQL左外連接
    在結果表中包含第一個表中滿足的所有紀錄,如果是在連接條件上匹配紀錄,則第二個表返回相應的值,否則第二個表返回空值。
    如:
    select hx.name,hx.age,hxhome.home from hx  left join hxhome on hx.id=hxhome.hxid

    SQL右外連接
    在結果表中包含第二個表中滿足的所有紀錄,如果是在連接條件上匹配紀錄,則第一個表返回相應的值,否則第一個表返回空值。
    如:
    select hx.name,hx.age,hxhome.home from hx  right outer join hxhome on hx.id=hxhome.hxid

    迫切左外連接
    以下兩種檢索方式是等價的,它們都能同時迫切左外連接類B和類C:
    //HQL迫切左外連接檢索方式
    from A a left join fetch a.b b left join fetch a.c c where b is not
    null and c is not null

    //QBC迫切左外連接檢索方式
    List result=session.createCriteria(A.class)
    .setFetchMode("this.b",FetchMode.EAGER)
    .setFetchMode("this.c",FetchMode.EAGER)
    .add(Expression.isNotNull("this.b"))
    .add(Expression.isNotNull("this.c"))
    .list();
    投影查詢
    select關鍵字用于選擇對象的部分屬性,例如:
    Iterator it=session.createQuery(
        "select c.id,c.name,o.orderNumber "
     + "  from Customer c join  c.orders o "
     +" where o.orderNumber like 'T%'" ).list().iterator();

    while(it.hasNext()){
     Object[] row=(Object[])it.next();
     Long orderNumber=(String)row[2];
     System.out.println(id+" "+name+" "+orderNumber);
    }
    投影查詢
    HQL查詢語句對應的SQL語句為:
    select c.ID,c.NAME,o.ORDER_NUMBER
    from CUSTOMERS c inner join ORDERS o
    on c.ID=o.CUSTOMER_ID where o.ORDER_NUMBER like 'T%';
    以上查詢語句的查詢結果如下:
    +----+------+--------------+
    | ID | NAME | ORDER_NUMBER |
    +----+------+--------------+
    |  1 | Tom  | Tom_Order001 |
    |  1 | Tom  | Tom_Order002 |
    |  1 | Tom  | Tom_Order003 |
    +----+------+--------------+
    Query的list()方法返回的集合中包含三個對象數(shù)組類型的元素,每個對象數(shù)組代表以上查詢結果的一條記錄。

     

    posted on 2007-11-23 11:23 HUIKK 閱讀(702) 評論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 18观看免费永久视频| a级毛片免费全部播放| 日本免费网址大全在线观看| 亚洲va久久久噜噜噜久久狠狠| 草久免费在线观看网站| 波多野结衣中文一区二区免费| 亚洲熟伦熟女专区hd高清| 在线天堂免费观看.WWW| 亚洲av无码一区二区三区观看| 黄色成人免费网站| 亚洲AV无码乱码在线观看代蜜桃| 亚洲一区二区免费视频| 亚洲国产成人久久99精品| 精品国产无限资源免费观看| 亚洲国语在线视频手机在线| 亚洲国产精品免费观看| 亚洲校园春色另类激情| 久久精品免费一区二区喷潮| 亚洲综合一区无码精品| 日韩免费电影在线观看| 免费一级毛片在线播放放视频 | 久久精品国产亚洲av四虎| 国产成人精品免费久久久久 | 亚洲人成自拍网站在线观看| 女人张开腿给人桶免费视频| 国产精品亚洲专一区二区三区| 亚洲天堂中文字幕在线| 久久久免费精品re6| 亚洲av永久无码精品天堂久久| 午夜私人影院免费体验区| 日韩在线视频线视频免费网站| 亚洲开心婷婷中文字幕| 桃子视频在线观看高清免费完整| 亚洲精品久久无码| 亚洲乱码中文字幕久久孕妇黑人| 99久久精品免费精品国产| 亚洲国产精品精华液| 亚洲中文字幕不卡无码| 日韩精品成人无码专区免费 | 久久美女网站免费| 国产亚洲精品成人AA片|