ice world

          There is nothing too difficult if you put your heart into it.
          posts - 104, comments - 103, trackbacks - 0, articles - 0
          大家都知道做分頁(yè)必須要知道總記錄數(shù),這就為我們出了一到小題兒,往往我們直接用Criteria調(diào)用list方法就返回全部查詢結(jié)果了,但是分頁(yè)必須在返回列表之前得到總行數(shù)。我之前的做法是寫兩個(gè)方法,參數(shù)完全一樣,一個(gè)返回 Integer,也就是記錄數(shù),一個(gè)返回List,結(jié)果集。這樣寫感覺(jué)挺麻煩的,還有人直接用criteria.list()返回記錄數(shù),再設(shè)置分頁(yè)屬性,那樣還叫什么分頁(yè)啊,調(diào)用list已經(jīng)將數(shù)據(jù)加載到內(nèi)存了,那不又成了內(nèi)存分頁(yè),這種做法程序處理簡(jiǎn)單了,性能降下來(lái)了。

          今天在網(wǎng)上閑逛發(fā)現(xiàn)了一個(gè)新招,代碼如下(只貼出回調(diào)函數(shù)里的代碼了):

          灰色斜體為業(yè)務(wù)相關(guān)代碼,請(qǐng)無(wú)視

          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);  // 業(yè)務(wù)代碼,請(qǐng)無(wú)視
              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()){  // 分頁(yè)
               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();
          }

          請(qǐng)注意綠色加粗那兩行代碼,那就是hibernate獲取記錄總行數(shù)的寫法,直接和獲取列表的方法寫在一起,貌似很簡(jiǎn)潔,很給力,如果你查詢的就是一張表,那么沒(méi)事了,但我查詢的日志是要關(guān)聯(lián)到用戶和日志分類的,最上面那三行代碼就是關(guān)聯(lián)了,這時(shí)發(fā)現(xiàn)返回到頁(yè)面后報(bào)錯(cuò)了,原因是返回的并不是我要的日志List,而是 Object[]的List,每個(gè)List里三個(gè)對(duì)象數(shù)組,主表的數(shù)組下標(biāo)是最后一個(gè),這時(shí)我就得使用藍(lán)色字體的代碼重新封裝后返回,我感覺(jué)這樣雖然解決了該問(wèn)題,但還是不給力,不完美,不perfect,就是不爽,于是請(qǐng)將注意力轉(zhuǎn)移到紅色加粗字體上,寫上它就OK了。


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 遂川县| 吉林市| 鞍山市| 庆元县| 屏东县| 航空| 内黄县| 遂平县| 乐昌市| 云龙县| 凉山| 永善县| 长寿区| 招远市| 山西省| 高台县| 楚雄市| 洞口县| 商城县| 贵港市| 金乡县| 天长市| 巴东县| 土默特左旗| 南昌市| 蒲城县| 陆河县| 博客| 闵行区| 华池县| 锡林浩特市| 平和县| 军事| 德化县| 远安县| 大足县| 扶绥县| 大方县| 宣汉县| 若尔盖县| 淳化县|