想飛就別怕摔

          大爺?shù)牟M罵人

          Hibernate 高級(jí)查詢(xún)技巧——集合過(guò)濾與子查詢(xún)(轉(zhuǎn))

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

          posted on 2009-10-26 22:48 生命的綻放 閱讀(2086) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Hibernate

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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(5)

          隨筆分類(lèi)(94)

          隨筆檔案(93)

          文章分類(lèi)(5)

          文章檔案(5)

          相冊(cè)

          JAVA之橋

          SQL之音

          兄弟之窗

          常用工具下載

          積分與排名

          最新評(píng)論

          閱讀排行榜

          主站蜘蛛池模板: 邵阳县| 宜丰县| 视频| 罗甸县| 隆昌县| 庆云县| 酒泉市| 金沙县| 阿拉善右旗| 泰州市| 黄梅县| 乌苏市| 英超| 南京市| 五莲县| 崇左市| 临洮县| 会东县| 岳池县| 呈贡县| 安龙县| 团风县| 兴城市| 萍乡市| 和平区| 旬邑县| 延津县| 阿瓦提县| 双流县| 金山区| 措美县| 新巴尔虎左旗| 鲜城| 姜堰市| 佛冈县| 察哈| 白山市| 金坛市| 庆安县| 雷州市| 理塘县|