Rory's Blog
          Happy study,Happy work,Happy life
          posts - 22,  comments - 46,  trackbacks - 0
          上篇文章:《今天發現一個hibernate的bug,或者說一個應該注意的地方比較合適 》里面我提到了Hibernate查詢需要注意的一個問題。今天發現了一個最好的解決辦法。如果大家現在用Hibernate,相信大家都回用到DetachedCriteria.關于DetachedCriteria查詢請查看http://dev.yesky.com/241/2033241.shtml。
          ????? DetachedCriteria給我們的Hibernate查詢帶來了很多方便,但是如果你帶上排序信息就會出現我的上一篇文章里面說的那種錯誤,今天發現一個很好的解決方法,其實也很簡單。就是先把傳入的帶Order信息的DetachedCriteria去掉order信息查詢數據總條數,然后再把Order加回來查詢滿足條件的對象。通過查看Hibernate的源代碼發現Criteria的實現CriteriaImpl發現其實addOrder是給private List orderEntries = new ArrayList();這個List加值。這個List里面放的是OrderEntry對象。這個OrderEntry里面放了一個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) 評論(12)  編輯  收藏 所屬分類: Webwork 、Spring

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

          是啊。java的反射嘛。
            回復  更多評論
            
          # re: 關于Hibernate的DetachedCriteria查詢的addOrder問題的解決辦法
          2006-12-28 13:16 | BeanSoft
          反射也要符合Java語言規范啊, 所以你這樣是行不通的.  回復  更多評論
            
          # re: 關于Hibernate的DetachedCriteria查詢的addOrder問題的解決辦法
          2006-12-28 13:19 | 莫多[匿名]
          如何行不同呢?
            回復  更多評論
            
          # re: 關于Hibernate的DetachedCriteria查詢的addOrder問題的解決辦法
          2008-06-20 16:41 | katelin
          field.setAccessible(true);  回復  更多評論
            
          # re: 關于Hibernate的DetachedCriteria查詢的addOrder問題的解決辦法[未登錄]
          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();  回復  更多評論
            
          # re: 關于Hibernate的DetachedCriteria查詢的addOrder問題的解決辦法
          2009-07-14 10:36 | 聚資庫
          好東西!!  回復  更多評論
            

          <2009年7月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(1)

          隨筆分類(27)

          隨筆檔案(22)

          Friends

          搜索

          •  

          積分與排名

          • 積分 - 62243
          • 排名 - 845

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 昌黎县| 固镇县| 东明县| 宜阳县| 苗栗县| 且末县| 新和县| 内江市| 灵川县| 南安市| 阳泉市| 开江县| 安陆市| 新河县| 普定县| 栖霞市| 永寿县| 铁力市| 盐津县| 高清| 陈巴尔虎旗| 二连浩特市| 镇原县| 体育| 砀山县| 兴山县| 乐至县| 渝中区| 汉阴县| 涿州市| 柏乡县| 历史| 武功县| 四川省| 嘉禾县| 新郑市| 双鸭山市| 沧源| 天全县| 临漳县| 乐业县|