Rory's Blog
          Happy study,Happy work,Happy life
          posts - 22,  comments - 46,  trackbacks - 0
          今天把myblog用sql server部署了一下,可是發(fā)現(xiàn)分頁查詢的時(shí)候出現(xiàn)錯(cuò)誤,看控制臺(tái)報(bào)錯(cuò)說語句有錯(cuò),由來發(fā)現(xiàn)分頁的時(shí)候先查詢總記錄數(shù)目的那條語句出錯(cuò)了
          select?count(*)?as?y0_?from?myblog_Blog?this_?inner?join?myblog_Blog_Category?categories3_?on?this_.id=categories3_.blogId?inner?join?myblog_Category?category1_?on?categories3_.categoryId=category1_.id?where?category1_.id=??order?by?this_.postTime?desc
          ????? 原來開發(fā)的時(shí)候我是用的mysql,沒有任何問題。原因就在最后面的order by 語句,sql server 在select count(*)里面不能用 order by。然后跟蹤代碼發(fā)現(xiàn):
          ????public?PaginationSupport?getBlogsByCategoryByPage(final?String?categoryId,?final?int?startIndex,?final?int?pageSize)?{
          ????????
          return?(PaginationSupport)?getHibernateTemplate().execute(new?HibernateCallback()?{
          ????????????
          public?Object?doInHibernate(Session?session)?throws?HibernateException?{
          ????????????????Criteria?criteria?
          =?session.createCriteria(Blog.class);
          ????????????????Criteria?cateCriteria?
          =?criteria.createCriteria("categories");
          ????????????????cateCriteria.add(Expression.eq(
          "id",categoryId));
          ????????????????criteria.addOrder(Order.desc(
          "postTime"));
          ????????????????
          int?totalCount?=?((Integer)?criteria.setProjection(Projections.rowCount())
          ????????????????????????.uniqueResult()).intValue();
          ????????????????criteria.setProjection(
          null);
          ????????????????
          ????????????????List?items?
          =?criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();
          ????????????????List?blogs?
          =?new?ArrayList();
          ????????????????
          for(Iterator?ite?=?items.iterator();?ite.hasNext();)?{
          ????????????????????Object[]?objs?
          =?(Object[])ite.next();
          ????????????????????blogs.add(objs[
          1]);
          ????????????????}
          ????????????????PaginationSupport?ps?
          =?new?PaginationSupport(blogs,?totalCount,?pageSize,?startIndex);
          ????????????????
          return?ps;
          ????????????}
          ????????},?
          true);
          ????}
          原來問題就在Criteria.addOrder(Order.desc("postTime"));這句話的位置上面,int totalCount = ((Integer) criteria.setProjection(Projections.rowCount())
          ??????.uniqueResult()).intValue();
          這句話的時(shí)候就會(huì)生成上面那句話,如果在這之前addOrder就會(huì)出現(xiàn)問題,如果你用mysql不會(huì)出現(xiàn)問題,如果你用sql server就會(huì)報(bào)錯(cuò)。解決方法就是把a(bǔ)ddOrder語句放到totalCount下面就可以了。
          ????public?PaginationSupport?getBlogsByCategoryByPage(final?String?categoryId,?final?int?startIndex,?final?int?pageSize)?{
          ????????
          return?(PaginationSupport)?getHibernateTemplate().execute(new?HibernateCallback()?{
          ????????????
          public?Object?doInHibernate(Session?session)?throws?HibernateException?{
          ????????????????Criteria?criteria?
          =?session.createCriteria(Blog.class);
          ????????????????Criteria?cateCriteria?
          =?criteria.createCriteria("categories");
          ????????????????cateCriteria.add(Expression.eq(
          "id",categoryId));
          ????????????????
          int?totalCount?=?((Integer)?criteria.setProjection(Projections.rowCount())
          ????????????????????????.uniqueResult()).intValue();
          ????????????????criteria.setProjection(
          null);
          ????????????????
          ????????????????
          /*
          ?????????????????*?Fix?a?bug?,Order?must?add?after?get?the?totalCount,
          ?????????????????*?beacuse?SqlServer?not?support?order?by?in?the?select?count(*).
          ?????????????????
          */
          ????????????????criteria.addOrder(Order.desc(
          "postTime"));
          ????????????????List?items?
          =?criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();
          ????????????????List?blogs?
          =?new?ArrayList();
          ????????????????
          for(Iterator?ite?=?items.iterator();?ite.hasNext();)?{
          ????????????????????Object[]?objs?
          =?(Object[])ite.next();
          ????????????????????blogs.add(objs[
          1]);
          ????????????????}
          ????????????????PaginationSupport?ps?
          =?new?PaginationSupport(blogs,?totalCount,?pageSize,?startIndex);
          ????????????????
          return?ps;
          ????????????}
          ????????},?
          true);
          ????}

          這樣生成的sql語句就是這樣的。
          select?count(*)?as?y0_?from?myblog_Blog?this_?inner?join?myblog_Blog_Category?categories3_?on?this_.id=categories3_.blogId?inner?join?myblog_Category?category1_?on?categories3_.categoryId=category1_.id?where?category1_.id=?

          以后大家也要注意了。呵呵。
          posted on 2006-05-21 22:49 莫多 閱讀(6449) 評(píng)論(4)  編輯  收藏 所屬分類: SpringHibernate

          FeedBack:
          # re: 今天發(fā)現(xiàn)一個(gè)hibernate的bug,或者說一個(gè)應(yīng)該注意的地方比較合適
          2006-05-30 08:22 | xiaofei_hu
          有沒有人給個(gè)合理的理由
          佩服你的debug能力。  回復(fù)  更多評(píng)論
            
          # re: 今天發(fā)現(xiàn)一個(gè)hibernate的bug,或者說一個(gè)應(yīng)該注意的地方比較合適
          2006-05-30 09:43 | 莫多
          這個(gè)就是因?yàn)镠ibernate的條件查詢的時(shí)候你可以addOrder()添加很多排序的方式。如果你在addOrder之后取totalcount那樣Hibernate也會(huì)把order by語句拼接到你的select count(*)語句后面。然而有的數(shù)據(jù)庫是不支持的。eg(SqlServer)所以就會(huì)出錯(cuò)了。請(qǐng)看我的最新文章。  回復(fù)  更多評(píng)論
            
          # re: 今天發(fā)現(xiàn)一個(gè)hibernate的bug,或者說一個(gè)應(yīng)該注意的地方比較合適
          2006-05-30 11:25 | xiaofei_hu
          明白明白了.  回復(fù)  更多評(píng)論
            
          # re: 今天發(fā)現(xiàn)一個(gè)hibernate的bug,或者說一個(gè)應(yīng)該注意的地方比較合適
          2011-08-10 19:02 | 鐵皮鬼
          不是hibernate的bug,這個(gè)是數(shù)據(jù)庫引起的,oracle就沒有這個(gè)問題。
          postgresql也存在同樣的問題。
          不過你的解決方法很不錯(cuò)。
          但有個(gè)小問題,參看 http://blog.csdn.net/ironskinspirit/article/details/6676740
            回復(fù)  更多評(píng)論
            

          <2006年5月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(1)

          隨筆分類(27)

          隨筆檔案(22)

          Friends

          搜索

          •  

          積分與排名

          • 積分 - 62477
          • 排名 - 845

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 阿图什市| 屯门区| 普宁市| 论坛| 广昌县| 平定县| 昂仁县| 涡阳县| 个旧市| 宁阳县| 二连浩特市| 石嘴山市| 林州市| 巧家县| 贡嘎县| 屏东县| 普格县| 固安县| 岫岩| 美姑县| 云龙县| 赤水市| 五大连池市| 墨玉县| 石门县| 辽源市| 游戏| 营山县| 新巴尔虎左旗| 二连浩特市| 特克斯县| 炎陵县| 阳高县| 淅川县| 锦屏县| 桂东县| 井研县| 基隆市| 灵武市| 襄垣县| 中阳县|