`
sunxboy
  • 浏览: 2887702 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

hibernate分页查询(pageSupport)注意问题

阅读更多

今天把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 = ?


以后大家也要注意了。呵呵。

分享到:
评论

相关推荐

    struts+spring+hibernate通用分页方法

    - 根据计算出的起始位置和每页记录数执行查询,获取分页后的数据列表,并将其封装到`PageSupport`对象中返回。 #### 四、总结 通过上述分析可以看出,该通用分页方法充分利用了Struts、Spring 和 Hibernate 的优势...

    java分页技术汇总

    PageSupport ps = new PageSupport(); ps.setPageSize(pageSize); ps.setRecordCount(recordCount); System.out.println("----页数------" + ps.getPageCount()); List<LeaveWord> items = new ArrayList(); ...

    java分页工具类[非常简洁好用]

    在Java世界里,我们通常会遇到如MyBatis、Hibernate等ORM框架,它们虽然提供了分页功能,但在某些场景下,自定义分页或者轻量级分页需求更受欢迎。本文将详细介绍一个简洁好用的Java分页工具类的使用方法,并探讨其...

    ssh 分页代码(延迟加载)

    在IT行业中,SSH(Spring、Struts、Hibernate)是一个经典的Java Web开发框架组合,而这里的"ssh 分页代码(延迟加载)"指的是在SSH框架下实现分页查询时采用的延迟加载技术。延迟加载是一种优化策略,它允许我们在...

    springmybatis

    查询出列表,也就是返回list, 在我们这个例子中也就是 List<User> , 这种方式返回数据,需要在User.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的 ...

    spring data jpa1.7 中文

    - 可以通过方法名定义不同的查询策略,例如分页查询、排序查询等。 - 示例: ```java Page<Person> findByFirstName(String firstName, Pageable pageable); ``` - **创建查询**: - 可以通过方法名定义基本的...

Global site tag (gtag.js) - Google Analytics