饒榮慶 -- 您今天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工作室 閱讀(3053) 評論(0)  編輯  收藏 所屬分類: j2ee
          主站蜘蛛池模板: 遵义县| 溧水县| 福州市| 吴江市| 教育| 达拉特旗| 弋阳县| 舒兰市| 临汾市| 乌鲁木齐县| 清水河县| 宜宾市| 宿迁市| 荃湾区| 清水县| 梅州市| 昌平区| 宣恩县| 洞头县| 凯里市| 乐亭县| 长宁区| 阿克陶县| 葫芦岛市| 宜阳县| 井研县| 金阳县| 温泉县| 柳林县| 太和县| 沁阳市| 吴川市| 宕昌县| 蓝田县| 平利县| 南宁市| 湖州市| 福清市| 镇原县| 恩平市| 柏乡县|