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 閱讀(912) 評論(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了。


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


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 浦县| 扶沟县| 孟津县| 肇东市| 陇西县| 闵行区| 岑溪市| 平安县| 牟定县| 韩城市| 全州县| 平远县| 乐清市| 龙川县| 山西省| 共和县| 胶南市| 定结县| 永济市| 临沭县| 临潭县| 鱼台县| 鹤岗市| 固始县| 广宗县| 凤冈县| 馆陶县| 吉水县| 德令哈市| 临漳县| 富阳市| 廉江市| 来安县| 淅川县| 潮安县| 东阿县| 潜山县| 黎城县| 贵阳市| 保靖县| 万载县|