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

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

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

    想飛就別怕摔

    大爺的并TM罵人

    Hibernate 高級查詢技巧——集合過濾與子查詢(轉)

         對于一個已經加載的Customer對象,假設對它的orders集合采用延遲加載機制,那么當調用customer.getOrders().iterator()時,Hibernate就會初始化orders集合,然后到數據庫中去加載Customer對象所關聯的Order對象,并且填充orders集合,但是很多時候我們其實只是需要關聯對象中符合某些條件的一部分對象,而并不需要加載全部關聯對象,而對性能帶來無謂的開銷。這時候我們就可以利用Hibernate的集合過濾功能,來處理關聯對象的加載。我們看下面的代碼:
    List list=session.createFilter(customer.getOrders(),“where this.price>100 order by this.price”).list();
    for(int i=0;i<list.size();i++){
     Order order=(Order)list.get(i);
    }
    在上面代碼中通過session.createFilter()方法,創建了一個集合過濾的查詢對象,這個方法需要兩個參數,第一個參數指定需要進行過濾操作的集合,第二個參數指定過濾集合的條件,方法返回Query對象。這個方法不要求它所要操作的集合對象已經初始化,但是要求包含這個集合對象的實體對象必須處于持久化狀態。當執行list()方法時不管持久化對象的集合是否已經初始化,都會到數據庫中去檢索數據,為了保證在Hibernate緩存中不會出現OID相同的對象,如果集合對象已經初始化,list()方法不會創建新的關聯實體對象,而僅僅返回已經存在的關聯實體對象。如果集合對象還沒有初始化,那么list()方法會創建關聯實體對象,但是不會初始化容納關聯實體對象的集合。除了可以向集合對象添加過濾條件進行稽核過濾之外,還可以進行很多其他操作,看下面的代碼:
        、對集合對象進行分頁:
    List list=session.createFilter(customer.getOders(),”order by this.price asc”)
    .setFirstResult(10)
    .setMaxResults(50)
    .list();
    ②、檢索集合中關聯對象的一個屬性:
    List list=session.createFilter(customer.getOrders(),”select this.ordernumber ”).list();
    2、子查詢:
      子查詢是SQL語句中非常重要的功能特性,它可以在SQL語句中利用另外一條SQL語句的查詢結果,在HibernateHQL查詢同樣對子查詢功能提供了支持。如下面代碼所示:
    List list=session.createQuery(“from Customer c where 1>(select count(o) from c.orders o)”).list();
    上面的程序查詢訂單數超過1的所有客戶,因此和上面子查詢HQL語句對應的SQL語句為:
    Select * from Customer c where 1>(select count(o.id) from Order o where c.id=o.customer_ID);
    如果子查詢返回多條記錄,則可以使用下面關鍵字:
    all:表示子查詢語句返回的所有記錄
    any:表示子查詢語句返回的任意一條結果
    some:”any”等價
    in:”=any”等價
    exists:表示子查詢語句至少返回一條記錄
    例如:查詢存在一條訂單價格大于100的客戶
    From Customer c where 100>any(select o.price from c.orders o);
    如果在子查詢中操作集合,HQL提供了一組操縱集合的函數和屬性:
    size()函數和size屬性:獲得集合中元素的數量
    minIndex()函數和minIndex屬性:對于建立了索引的集合獲得最小索引值(關于集合索引參考第一部分映射值類型集合)
    minElement()函數和minElement屬性:對于包含基本類型的元素集合,獲得集合中值最小的元素
    maxElement()函數和maxElement屬性:對于包含基本類型元素的集合,獲得集合中值最大的元素
    element()函數:獲得集合中所有元素
    例如:查詢訂單數大于0的客戶
    From Customer c where size(c.orders)>0;或者From Customer c where c.orders.size>0;
    以上HQL語句會生成類似如下的SQL語句:
    Select * from customer c where 0>(select count(o.id) from order where o. customer_ID =c.id);
    注:在HQL中子查詢必須出現在where子句中,而且必須用一對圓括號括起來。為什么必須要出現在where字句之后呢?其實我們大家仔細想一下也就知道了,在Hibernate中查詢的任何一個實體對象都要有據可循,這個“據”就是Hibernate的主配置文件,也就是說凡是出現在HQL from字句中的實體對象,都必須要在Hibernate主配置文件中有明確的配置。所以在Hibernate中無法支持SQL語句中的那種出現在from字句之后的那種動態視圖子查詢。

    posted on 2009-10-26 22:48 生命的綻放 閱讀(2083) 評論(0)  編輯  收藏 所屬分類: Hibernate

    <2009年10月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(5)

    隨筆分類(94)

    隨筆檔案(93)

    文章分類(5)

    文章檔案(5)

    相冊

    JAVA之橋

    SQL之音

    兄弟之窗

    常用工具下載

    積分與排名

    最新評論

    閱讀排行榜

    主站蜘蛛池模板: 亚洲欧洲高清有无| 夜夜春亚洲嫩草影院| 亚洲精品在线播放视频| 久久国产精品免费网站| 亚洲爱情岛论坛永久| 99国产精品免费观看视频| 亚洲综合亚洲国产尤物| 成人午夜免费福利视频| 亚洲第一成人在线| 性感美女视频免费网站午夜 | 国产成人1024精品免费| 国产成人精品日本亚洲专区 | 亚洲色偷偷色噜噜狠狠99| 成年女人毛片免费观看97| 亚洲成a∨人片在无码2023 | 春意影院午夜爽爽爽免费| 国内精品99亚洲免费高清| 一个人免费视频在线观看www | 麻豆国产精品入口免费观看| 美女黄网站人色视频免费| 中文字幕久久亚洲一区| 99re在线免费视频| 亚洲午夜成人精品无码色欲| 亚洲A丁香五香天堂网| 国产综合免费精品久久久| 亚洲精品成人网站在线播放| 免费黄色一级毛片| 国产免费牲交视频免费播放| 亚洲人成亚洲精品| 日韩精品视频免费观看| 一级特黄录像免费播放肥| 亚洲精品国产第1页| 日韩激情淫片免费看| 国产精品免费αv视频| 亚洲色欲www综合网| 免费A级毛片在线播放不收费| 久久免费视频一区| 精品亚洲AV无码一区二区 | 久久精品国产亚洲AV高清热| 午夜电影免费观看| 久久国产精品免费专区|