Rory's Blog
          Happy study,Happy work,Happy life
          posts - 22,  comments - 46,  trackbacks - 0
          上篇文章:《今天發(fā)現(xiàn)一個(gè)hibernate的bug,或者說(shuō)一個(gè)應(yīng)該注意的地方比較合適 》里面我提到了Hibernate查詢需要注意的一個(gè)問(wèn)題。今天發(fā)現(xiàn)了一個(gè)最好的解決辦法。如果大家現(xiàn)在用Hibernate,相信大家都回用到DetachedCriteria.關(guān)于DetachedCriteria查詢請(qǐng)查看http://dev.yesky.com/241/2033241.shtml
          ????? DetachedCriteria給我們的Hibernate查詢帶來(lái)了很多方便,但是如果你帶上排序信息就會(huì)出現(xiàn)我的上一篇文章里面說(shuō)的那種錯(cuò)誤,今天發(fā)現(xiàn)一個(gè)很好的解決方法,其實(shí)也很簡(jiǎn)單。就是先把傳入的帶Order信息的DetachedCriteria去掉order信息查詢數(shù)據(jù)總條數(shù),然后再把Order加回來(lái)查詢滿足條件的對(duì)象。通過(guò)查看Hibernate的源代碼發(fā)現(xiàn)Criteria的實(shí)現(xiàn)CriteriaImpl發(fā)現(xiàn)其實(shí)addOrder是給private List orderEntries = new ArrayList();這個(gè)List加值。這個(gè)List里面放的是OrderEntry對(duì)象。這個(gè)OrderEntry里面放了一個(gè)criteria 和 order.

          ????
          ????public?PaginationSupport?findPageByCriteria(final?DetachedCriteria?detachedCriteria,?final?int?pageSize,?final?int?startIndex)?{
          ????????
          return?(PaginationSupport)?getHibernateTemplate().execute(new?HibernateCallback()?{
          ????????????
          public?Object?doInHibernate(Session?session)?throws?HibernateException?{
          ????????????????Criteria?criteria?
          =?detachedCriteria.getExecutableCriteria(session);
          ????????????????CriteriaImpl?impl?
          =?(CriteriaImpl)?criteria;
          ????????????????List?orderEntrys?
          =?new?ArrayList();
          ????????????????
          try{
          ????????????????????Field?field?
          =?CriteriaImpl.class.getDeclaredField("orderEntries");
          ????????????????????
          //Get?orders
          ????????????????????orderEntrys?=?(List)?field.get(impl);
          ????????????????????
          //Remove?orders
          ????????????????????field.set(criteria,new?ArrayList());
          ????????????????}
          catch(Exception?ex){
          ????????????????????ex.printStackTrace();
          ????????????????????
          //TODO?xxxx
          ????????????????}
          ????????????????
          int?totalCount?=?((Integer)?criteria.setProjection(Projections.rowCount())
          ????????????????????????.uniqueResult()).intValue();
          ????????????????criteria.setProjection(
          null);
          ????????????????
          ????????????????
          try{
          ????????????????????Field?field?
          =?CriteriaImpl.class.getDeclaredField("orderEntries");
          ????????????????????
          //Add?orders?return
          ????????????????????for(int?i=0;?i<orderEntrys.size();?i++){
          ????????????????????????List?innerOrderEntries?
          =?(List)?field.get(criteria);
          ????????????????????????innerOrderEntries.add(orderEntrys.get(i));
          ????????????????????}
          ????????????????}
          catch(Exception?ex){
          ????????????????????ex.printStackTrace();
          ????????????????????
          //TODO?cccc
          ????????????????}
          ????????????????List?items?
          =?criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();
          ????????????????PaginationSupport?ps?
          =?new?PaginationSupport(items,?totalCount,?pageSize,
          ????????????????????????startIndex);
          ????????????????
          return?ps;
          ????????????}
          ????????},?
          true);
          ????}
          希望大家多多交流
          posted on 2006-05-29 23:29 莫多 閱讀(5042) 評(píng)論(12)  編輯  收藏 所屬分類: WebworkSpring

          FeedBack:
          # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問(wèn)題的解決辦法
          2006-06-06 21:10 | Tin
          才發(fā)現(xiàn)我們遇到了類似的問(wèn)題,前幾天看你這篇Blog還沒(méi)看明白什么意思呢。今天發(fā)現(xiàn)都是同樣的問(wèn)題,哈哈:D
          http://www.aygfsteel.com/iamtin/archive/2006/06/06/50702.html  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問(wèn)題的解決辦法
          2006-06-06 22:06 | 莫多
          是啊。都是這個(gè)問(wèn)題,不過(guò)Robbin給出了最終解決方法。呵呵。
          http://www.javaeye.com/display/opensourceframework/HibernateUtils
          可以看看。  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問(wèn)題的解決辦法
          2006-11-30 11:59 | guolp
          哥們,當(dāng)我 field.set(criteria,new ArrayList());
          的時(shí)候,報(bào)錯(cuò)啊,提示不能修改private的成員
          你是怎么解決的呢  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問(wèn)題的解決辦法
          2006-11-30 12:03 | 莫多[匿名]
          field.set(criteria,new ArrayList());
          這個(gè)是在做什么?  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問(wèn)題的解決辦法
          2006-11-30 12:03 | 莫多[匿名]
          能詳細(xì)說(shuō)明的么?
            回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問(wèn)題的解決辦法
          2006-12-22 15:36 | 陳亮
          私有變量能這樣子取 并 做修改?????????  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問(wèn)題的解決辦法
          2006-12-22 15:41 | 莫多[匿名]
          @陳亮

          是啊。java的反射嘛。
            回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問(wèn)題的解決辦法
          2006-12-28 13:16 | BeanSoft
          反射也要符合Java語(yǔ)言規(guī)范啊, 所以你這樣是行不通的.  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問(wèn)題的解決辦法
          2006-12-28 13:19 | 莫多[匿名]
          如何行不同呢?
            回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問(wèn)題的解決辦法
          2008-06-20 16:41 | katelin
          field.setAccessible(true);  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問(wèn)題的解決辦法[未登錄](méi)
          2008-09-03 11:05 | nicholas
          Criteria criteria = detachedCriteria
          .getExecutableCriteria(openSession());
          CriteriaImpl impl = (CriteriaImpl) criteria;
          //Remove order clauses where query count.
          //Order clause may cause some problem when we query count in some
          //database.
          //such as hsqldb.
          List orderEntrys = new ArrayList();
          try{
          Field field = CriteriaImpl.class.getDeclaredField("orderEntries");
          //field is private, so we must set it accessible when we access it.
          field.setAccessible(true);
          //Get orders
          orderEntrys = (List) field.get(impl);
          //Remove orders
          field.set(criteria,new ArrayList());
          }catch(Exception ex){
          ex.printStackTrace();
          }

          int totalCount = ((Integer) criteria.setProjection(
          Projections.rowCount()).uniqueResult()).intValue();
          criteria.setProjection(null);
          //add stored order clauses.
          try{
          Field field = CriteriaImpl.class.getDeclaredField("orderEntries");
          field.setAccessible(true);
          List innerOrderEntries = (List) field.get(criteria);
          innerOrderEntries.addAll(orderEntrys);
          }catch(Exception ex){
          ex.printStackTrace();
          }

          List<T> items = criteria.setFirstResult(startIndex)
          .setMaxResults(pageSize).list();  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于Hibernate的DetachedCriteria查詢的addOrder問(wèn)題的解決辦法
          2009-07-14 10:36 | 聚資庫(kù)
          好東西!!  回復(fù)  更多評(píng)論
            

          <2008年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(1)

          隨筆分類(27)

          隨筆檔案(22)

          Friends

          搜索

          •  

          積分與排名

          • 積分 - 62245
          • 排名 - 845

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 沾益县| 佛学| 冀州市| 瑞金市| 宁津县| 芷江| 嵊州市| 老河口市| 渭南市| 西畴县| 泾川县| 铜川市| 潜江市| 会昌县| 天镇县| 南岸区| 阿鲁科尔沁旗| 临汾市| 佛学| 民县| 来宾市| 法库县| 漳浦县| 曲沃县| 文登市| 丹江口市| 民乐县| 商河县| 岳阳县| 贵南县| 卓尼县| 托克逊县| 邯郸县| 阿荣旗| 土默特左旗| 松潘县| 安阳市| 莲花县| 静乐县| 普格县| 嘉鱼县|