饒榮慶 -- 您今天UCWEB了嗎?--http://www.ucweb.com

          3G 手機開發網

             :: 首頁 :: 聯系 :: 聚合  :: 管理
            99 Posts :: 1 Stories :: 219 Comments :: 0 Trackbacks
          今天上午回來設計了一點新聞發布系統周邊的功能,并實現了對新聞進行重新索引的功能。
          但同時在列出相關新聞的時候遇到了麻煩。就是原本運行好好的分頁查詢代碼,居然有個小蟲子跑出來,
          很是令人不爽。說來也慚愧,Hibernate也用了那么長時間了。可對底層API卻很不屬性。
          查了下網絡,把自己的一知半解說出來。

          bug起源。
          看看代碼:
          return (PageSupport) getHibernateTemplate().execute(
                          new HibernateCallback() ...{
                              public Object doInHibernate(Session session)
                                      throws HibernateException ...{
                                  Criteria criteria = detachedCriteria
                                          .getExecutableCriteria(session);
                               
                                  
                                  logger.debug("SQL: " + Projections.rowCount());
                                  
                                  
                                   
                                  //執行查詢
                                  int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();

                               
                               
                                  
                                  
                                  List items = criteria.setFirstResult(startIndex)
                                  .setMaxResults(pageSize).list();
                          
                                  PageSupport ps = new PageSupport(items, totalCount,
                                          pageSize, startIndex);
                                  
                                  return ps;
                              }
                          }, true);

          相信大家對上面的代碼也很熟悉了,這個代碼第一次運行的時候沒問題。
          等你去拿第2頁的時候,就提示說出現NullPointer。 發現是((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult())為Null, 也就是根本就拿不到表總數。
          為此我思考了好一陣子。
          后來看了別人的代碼才煥然大悟。
          看第2個代碼:
          return (PageSupport) getHibernateTemplate().execute(
                          new HibernateCallback() ...{
                              public Object doInHibernate(Session session)
                                      throws HibernateException ...{
                                  Criteria criteria = detachedCriteria
                                          .getExecutableCriteria(session);
                                  
                                  CriteriaImpl impl = (CriteriaImpl) criteria;

                                  //先把Projection和OrderBy條件取出來,清空兩者來執行Count操作
                                  Projection projection = impl.getProjection();
                                  
                                  logger.debug("SQL: " + Projections.rowCount());
                                  
                                  
                                   
                                  //執行查詢
                                  int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();

                                  //將之前的Projection和OrderBy條件重新設回去
                                  criteria.setProjection(projection);
                                  if (projection == null) ...{
                                      criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
                                  }
                               
                                  
                                  
                                  List items = criteria.setFirstResult(startIndex)
                                  .setMaxResults(pageSize).list();
                          
                                  PageSupport ps = new PageSupport(items, totalCount,
                                          pageSize, startIndex);
                                  
                                  return ps;
                              }
                          }, true);



          爬蟲工作室 -- 專業的手機軟件開發工作室
          3G視線 -- 專注手機軟件開發
          posted on 2007-04-30 08:46 3G工作室 閱讀(3060) 評論(0)  編輯  收藏 所屬分類: j2ee
          主站蜘蛛池模板: 江北区| 乌鲁木齐县| 潮安县| 江北区| 镇宁| 理塘县| 朔州市| 景东| 察隅县| 南京市| 温州市| 浙江省| 保靖县| 安塞县| 安顺市| 涿鹿县| 安新县| 鞍山市| 台湾省| 合山市| 彭泽县| 扶绥县| 绥芬河市| 凉城县| 天柱县| 东平县| 新巴尔虎右旗| 彰武县| 拉萨市| 福建省| 科尔| 海南省| 苏尼特右旗| 紫阳县| 三明市| 大悟县| 桐梓县| 翼城县| 霍林郭勒市| 射洪县| 中江县|