ice world

          There is nothing too difficult if you put your heart into it.
          posts - 104, comments - 103, trackbacks - 0, articles - 0

          Hibernate Criteria分頁產生的問題

          Posted on 2011-04-16 02:26 IceWee 閱讀(916) 評論(0)  編輯  收藏 所屬分類: Hibernate
          大家都知道做分頁必須要知道總記錄數,這就為我們出了一到小題兒,往往我們直接用Criteria調用list方法就返回全部查詢結果了,但是分頁必須在返回列表之前得到總行數。我之前的做法是寫兩個方法,參數完全一樣,一個返回 Integer,也就是記錄數,一個返回List,結果集。這樣寫感覺挺麻煩的,還有人直接用criteria.list()返回記錄數,再設置分頁屬性,那樣還叫什么分頁啊,調用list已經將數據加載到內存了,那不又成了內存分頁,這種做法程序處理簡單了,性能降下來了。

          今天在網上閑逛發現了一個新招,代碼如下(只貼出回調函數里的代碼了):

          灰色斜體為業務相關代碼,請無視

          public Object doInHibernate(Session session) throws HibernateException, SQLException {
              Criteria criteria = session.createCriteria(XtLog.class);
              Criteria userCriteria = criteria.createCriteria("xtUser");
              Criteria lcCriteria = criteria.createCriteria("xtLogClass");
              if (StringUtils.isNotBlank(userId)) {
               userCriteria.add(Restrictions.like("userId", userId, MatchMode.START));
              }
              if (StringUtils.isNotBlank(logClassId)) {
               lcCriteria.add(Restrictions.eq("logClassId", logClassId));
              }
              if (beginDate != null && endDate != null) {
               criteria.add(Restrictions.between("xtOplogtime", beginDate, endDate));
              }

              int totalRows =((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
              psm.setTotalRows(totalRows);  // 業務代碼,請無視
              criteria.setProjection(null);
              criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
              Map<String, String> orderMap = psm.getOrderMap();
              if(orderMap != null){
               setOrder(criteria, userCriteria, lcCriteria, orderMap);
              }

              if(!psm.isAll()){  // 分頁
               criteria.setFirstResult(psm.getRowStart());
               criteria.setMaxResults(psm.getPageSize());
              }
          //    List<XtLog> logs = new ArrayList<XtLog>(); // 返回日志列表
          //    List<Object[]> list = criteria.list();
          //    for (Object[] o : list) {
          //     logs.add((XtLog) o[2]);
          //    }
          //    return logs;
              return criteria.list();
          }

          請注意綠色加粗那兩行代碼,那就是hibernate獲取記錄總行數的寫法,直接和獲取列表的方法寫在一起,貌似很簡潔,很給力,如果你查詢的就是一張表,那么沒事了,但我查詢的日志是要關聯到用戶和日志分類的,最上面那三行代碼就是關聯了,這時發現返回到頁面后報錯了,原因是返回的并不是我要的日志List,而是 Object[]的List,每個List里三個對象數組,主表的數組下標是最后一個,這時我就得使用藍色字體的代碼重新封裝后返回,我感覺這樣雖然解決了該問題,但還是不給力,不完美,不perfect,就是不爽,于是請將注意力轉移到紅色加粗字體上,寫上它就OK了。


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 民勤县| 彝良县| 辰溪县| 孟州市| 洛宁县| 依安县| 竹北市| 景德镇市| 吉林省| 南岸区| 中江县| 紫金县| 开江县| 天祝| 景东| 沭阳县| 南京市| 福州市| 莱阳市| 莲花县| 浮山县| 邢台市| 二连浩特市| 祁东县| 太康县| 万安县| 盐山县| 平乡县| 南阳市| 鸡西市| 沙田区| 新津县| 石首市| 屯昌县| 沾益县| 富民县| 湟中县| 喀喇沁旗| 漯河市| 修武县| 商河县|