今天发现一个hibernate的bug,或者说一个应该注意的地方比较合适

原创 2006年05月23日 09:41:00
今天把myblog用sql server部署了一下,可是发现分页查询的时候出现错误,看控制台报错说语句有错,由来发现分页的时候先查询总记录数目的那条语句出错了
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
      原来开发的时候我是用的mysql,没有任何问题。原因就在最后面的order by 语句,sql server 在select count(*)里面不能用 order by。然后跟踪代码发现:
    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();
这句话的时候就会生成上面那句话,如果在这之前addOrder就会出现问题,如果你用mysql不会出现问题,如果你用sql server就会报错。解决方法就是把addOrder语句放到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=?

以后大家也要注意了。呵呵。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

今天发现一个hibernate的bug,或者说一个应该注意的地方比较合适

今天把myblog用sql server部署了一下,可是发现分页查询的时候出现错误,看控制台报错说语句有错,由来发现分页的时候先查询总记录数目的那条语句出错了 select count(*) as ...

前端动画的bug:hover一个li,左滑进背景图,li上文字消失太快(或者说出现闪现消失)

要求实现的动效:左边每一条li鼠标经过的时候,蓝色框从左边滑进,右边图片从右边滑进 出现的bug:hover上一个li,文字的变白速度比滑出条速度快,出现一瞬间的闪现效果(或者说完全消失) 解决,...

交换变量值的方法,异或并不高效或者说是一个花哨的招聘产物

今天上午听同学说不用中间变量怎么交换两个变量的值,下面就罗列了几种交换值的方法,并且测试了其中3种交换变量值方法的效率。这种方法也有一定缺陷:当要交换的两个数值指向同一个内存空间时交换就会出错即a^=...

今天发现的一个VC6.0在私有变量声明时的BUG

如果有人说,VC的宏能够影响到类成员变量的属性,你信吗?反正是我信了! 今天在修改一个程序的时候,我在类A的外部使用指向类B的指针,居然能够访问到类B的受保护成员变量!!!!!这让我感到非常奇怪,于是...

今天非常高兴,解决了一个关于java类转json时有关联对象而且困扰我很久的BUG

之前在做毕设的时候,在java类转json且有关联对象的时候总是会遇到如下的错误,真的是困扰我很久   freemarker.template.TemplateModelException: Met...

vc++6.0工程拷贝到另外一个地方,会出现功能不全或者打不开工程解决方案

vc++6.0工程拷贝到另外一个地方,会出现功能不全或者打不开工程解决方案如下: 1)若工程涉及到数据库,应配置数据库文件至该工程目录下(控制面板->管理工具->数据源ODBC); 2)  若无上...

作为一个程序员应该注意的地方

以下仅是个人看法,欢迎大家指正,相互交流 阶段一:毕业时 作为一个刚毕业时的我,只要找一份工作可能就满足了,其实第一份工作对程序员来说是很重要的。作为一个过来人,我还是建议毕业生应该慎重的选择第一...

VC 2008 一个 可能的BUG ,或者本人的无知,请有大侠解读一下

/*源码*/ #include void ttt(size_t bsize) { size_t _size = bsize > 1 ? bsize : 9; printf("re...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)