`
sunxboy
  • 浏览: 2869019 次
  • 性别: 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 = ?


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

分享到:
评论

相关推荐

    Hibernate分页查询小结

    Hibernate分页查询小结

    Hibernate分页查询原理解读

    ### Hibernate 分页查询原理详解 #### 一、引言 在大数据量处理场景下,分页查询是提高数据检索效率的重要手段之一。Hibernate作为Java领域内最常用的持久层框架之一,其内置的分页功能非常实用且高效。本文将深入...

    hibernate分页查询 数据库连接

    此外,优化查询,避免N+1查询问题,合理设计实体关系,都能有效提升Hibernate分页查询的效率。 总结起来,Hibernate的分页查询和数据库连接管理是其强大功能的重要组成部分。正确理解和使用这些特性,能够帮助...

    使用hibernate分页查询

    以下是如何使用Hibernate进行分页查询的详细说明: 1. **配置Hibernate分页**: 在Hibernate中,我们通常使用`Criteria`或`Query` API进行分页查询。`Criteria`提供了一种更面向对象的方式来执行SQL查询,而`Query...

    hibernate分页查询

    Hibernate,作为一个流行的Java对象关系映射(ORM)框架,为开发者提供了便捷的分页查询功能。让我们深入探讨Hibernate分页查询的相关知识点。 一、Hibernate分页原理 Hibernate分页查询基于SQL的LIMIT和OFFSET子句...

    hibernate分页查询功能

    本示例中,我们看到如何利用Struts2、Spring和Hibernate这三个流行框架来实现分页查询功能。下面我们将详细讲解这个实现过程。 1. **UserDao接口**: UserDao接口定义了分页查询的方法,通过`getUser(int offset, ...

    STRUTS2+HIBERNATE详细的分页实现代码详细的分页实现代码

    在这个类中,我们可以通过编写Hibernate HQL或SQL查询语句来实现分页查询。 4. **Struts2 Action** 在Action类中,我们需要处理来自用户的请求参数,如当前页码和每页显示记录数等,并调用DAO中的分页查询方法获取...

    Hibernate 分页查询效果

    值得注意的是,虽然Hibernate提供了分页查询的功能,但在大数据量场景下,单纯依赖于数据库的分页可能会导致性能问题。为了优化,可以考虑使用“分页缓存”或“游标查询”等策略。分页缓存可以将已查询过的页面数据...

    Struts和Hibernate分页及查询

    在分页查询中,Hibernate提供了一种称为HQL(Hibernate Query Language)的SQL方言,可以方便地实现复杂的查询,包括分页查询。此外,Hibernate还支持Criteria查询,这是一种更加面向对象的查询方式,同样可以实现...

    hibernate 模糊查询 分页

    接下来,我们讨论分页查询。在处理大量数据时,一次性加载所有结果可能会导致性能问题。因此,通常会采用分页的方式来获取数据。在Hibernate中,我们可以使用`Criteria`或`Query`对象的`setFirstResult()`和`...

    hibernate分页Hibernate 分页的设计和编码

    使用Hibernate进行分页查询时,可以通过设置`FirstResult`和`MaxResults`来限制查询结果集的范围。 ```java Query queryObject = getSession().createQuery("FROM User"); queryObject.setFirstResult((currentPage...

    hibernate实现分页查询

    ### Hibernate 实现分页查询...此外,在编写分页查询逻辑时,还需注意SQL注入等安全问题,合理使用参数化查询等方式可以有效避免这些问题的发生。 以上就是关于Hibernate实现分页查询的具体介绍,希望对大家有所帮助。

    springmvc+hibernate+spring maven案例(包含分页查询)

    这个压缩包提供的案例是这三个框架的整合使用,涵盖了基本的CRUD(创建、读取、更新、删除)操作,并且包含了分页查询的功能。下面将详细讲解这些知识点。 1. **Spring MVC** - Spring MVC是Spring框架的一个模块...

    Hibernate 多表连接分页查询示范项目

    总结,"Hibernate 多表连接分页查询示范项目"是一个实用的示例,它展示了如何在实际应用中利用 Hibernate Criteria API 实现复杂查询和分页,对于学习和掌握 Hibernate 的高级特性和数据库操作技巧非常有帮助。...

    用Hibernate实现分页查询.docx

    ### 使用Hibernate实现分页查询 #### 一、分页查询概念及原理 分页查询是一种在数据量较大的情况下,为了提高用户体验和系统性能而采取的一种技术手段。它将查询结果分成若干页显示,用户可以通过翻页操作查看不同...

    基于spring+hibernate的组合查询+分页组件

    在Hibernate中,我们可以通过设置FirstResult(对应于SQL的LIMIT开始位置)和MaxResults(对应于SQL的LIMIT大小)参数来实现分页查询。 以下是一个简单的示例,展示如何在Spring和Hibernate中实现组合查询和分页: ...

    hibernate分页代码

    本教程将详细讲解如何在Hibernate中实现分页查询,以及如何在MyEclipse集成环境中运行这段代码。 首先,让我们了解什么是分页查询。分页查询是数据库管理中的一个常见需求,特别是在处理大量数据时,为了提高用户...

    struts2+spring+hibernate分页查询

    综上所述,Struts2、Spring和Hibernate的整合使得开发者能够便捷地实现分页查询,从而优化Web应用的性能和用户体验。在实际项目中,需要根据具体需求和业务场景,选择合适的分页策略和实现方式,同时注意性能优化和...

    Hibernate分页可能引起的性能问题

    Hibernate分页可能引起的性能问题 在使用Hibernate进行分页的过程中,如果你收到如下警告,那么这里就是一个潜在的性能问题点: WARNING: firstResult/maxResults specified with collection fetch; applying in ...

    Hibernate中分页查询的封装。

    本文将深入探讨如何在Hibernate中进行分页查询的封装,并提供相关的源码和工具使用方法。 首先,我们需要了解Hibernate中的Criteria查询,这是实现分页查询的一种方式。Criteria API允许我们以面向对象的方式构建...

Global site tag (gtag.js) - Google Analytics