`
wuhua
  • 浏览: 2110344 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

解决HIbernate分页问题获取表总行数的小Bug

阅读更多
今天上午回来设计了一点新闻发布系统周边的功能,并实现了对新闻进行重新索引的功能。
但同时在列出相关新闻的时候遇到了麻烦。就是原本运行好好的分页查询代码,居然有个小虫子跑出来,
很是令人不爽。说来也惭愧,Hibernate也用了那么长时间了。可对底层API却很不属性。
查了下网络,把自己的一知半解说出来。

bug起源。
看看代码:
return (PageSupport) getHibernateTemplate().execute(
                
new HibernateCallback() ...{
                    
public Object doInHibernate(Session session)
                            
throws HibernateException ...{
                        Criteria criteria 
= detachedCriteria
                                .getExecutableCriteria(session);
                     
                        
                        logger.debug(
"SQL: " + Projections.rowCount());
                        
                        
                         
                        
//执行查询
                        int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();

                     
                     
                        
                        
                        List items 
= criteria.setFirstResult(startIndex)
                        .setMaxResults(pageSize).list();
                
                        PageSupport ps 
= new PageSupport(items, totalCount,
                                pageSize, startIndex);
                        
                        
return ps;
                    }

                }
true);

相信大家对上面的代码也很熟悉了,这个代码第一次运行的时候没问题。
等你去拿第2页的时候,就提示说出现NullPointer。 发现是((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult())为Null, 也就是根本就拿不到表总数。
为此我思考了好一阵子。
后来看了别人的代码才焕然大悟。
看第2个代码:
return (PageSupport) getHibernateTemplate().execute(
                
new HibernateCallback() ...{
                    
public Object doInHibernate(Session session)
                            
throws HibernateException ...{
                        Criteria criteria 
= detachedCriteria
                                .getExecutableCriteria(session);
                        
                        CriteriaImpl impl 
= (CriteriaImpl) criteria;

                        
//先把Projection和OrderBy条件取出来,清空两者来执行Count操作
                        Projection projection = impl.getProjection();
                        
                        logger.debug(
"SQL: " + Projections.rowCount());
                        
                        
                         
                        
//执行查询
                        int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();

                        
//将之前的Projection和OrderBy条件重新设回去
                        criteria.setProjection(projection);
                        
if (projection == null...{
                            criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
                        }

                     
                        
                        
                        List items 
= criteria.setFirstResult(startIndex)
                        .setMaxResults(pageSize).list();
                
                        PageSupport ps 
= new PageSupport(items, totalCount,
                                pageSize, startIndex);
                        
                        
return ps;
                    }

                }
true);
分享到:
评论
4 楼 ohgold 2007-06-17  
hibernate分页的同时获取记录总数的好办法:
http://www.9421.net.cn/blog/blogindex.jsp
看看。
3 楼 ohgold 2007-06-17  
hibernate分页的同时获取记录总数的好办法:
http://www.9421.net.cn/blog/blogindex.jsp
看看。
2 楼 somebody 2007-05-01  
是说我么?
呵呵。
我说明了的。
1 楼 rainlife 2007-04-30  
好像在别的地方看到过,现在好多朋友即在CSDN,又在blogjava,又在javaeye上面发表同一个文章,建议这样的朋友在发的时候,说明一下,不然,又要以为是转载了。

相关推荐

    Hibernate分页查询小结

    Hibernate分页查询小结

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

    标题与描述均提到了“Hibernate分页的设计和编码”,这表明文章主要聚焦于如何在Hibernate框架中实现数据分页功能。下面将详细解析这一主题的关键知识点。 ### Hibernate分页概念 Hibernate是Java环境下一个开放源...

    Hibernate分页查询原理解读

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

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

    根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要探讨的是如何在Struts2与Hibernate框架结合下实现分页功能。接下来将详细解析Struts2与Hibernate如何协作完成这一任务。 ### Struts2与Hibernate...

    hibernate分页查询

    FirstResult表示从结果集的第几个元素开始获取,MaxResults则限制返回的最大记录数。 二、使用Criteria API进行分页 1. 创建Criteria对象:`Criteria criteria = session.createCriteria(entityClass);` 2. 设置...

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

    项目通过 Hibernate Criteria API 展示了如何进行多表连接查询,并结合分页功能,有效地获取和展示相关数据。项目源码会详细展示如何创建 Criteria 查询,如何设置 JOIN 条件,以及如何实现分页。 **具体步骤** 1....

    hibernate分页查询 数据库连接

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

    Struts + Hibernate 分页实现

    在分页场景下,一个Action类可能会包含获取当前页数、每页显示条数以及执行查询等方法。当用户点击页面链接时,Struts会根据配置的Action Mapping将请求转发到对应的Action。 接下来是Hibernate的使用。在数据库...

    hibernate分页代码

    在MyEclipse中运行这些代码,你需要确保已经正确配置了Hibernate项目,包括Hibernate的jar包、数据库连接配置(hibernate.cfg.xml)、实体类的映射文件(.hbm.xml),并且已经创建了对应的数据库表。 在实际应用中...

    struts2+spring+hibernate分页显示完整代码

    在`MemberDao`接口中,我们定义了两个关键的方法,一个是用于分页查询,另一个是获取所有记录的数量。这两个方法分别如下: 1. `queryForPage` 方法接受三个参数:HQL(Hibernate Query Language)查询语句、开始...

    spring+hibernate 分页 +mysql

    通过设置页码和每页大小,可以获取到分页数据。 ```java Pageable pageable = PageRequest.of(pageNumber, pageSize); List<MyEntity> entities = myEntityRepository.findAll(pageable); ``` 5. **分页查询**: 在...

    strut2.0 + hibernate3.0 + jquery.datatables+mysql 5.0实现的 hibernate分页

    hibernate分页(无排序,搜索,仅仅分页显示),服务器端分页在datatables上展现,有关 datatables的知识请关注它的官网http://www.datatables.net/,datatables的功能很 全面。 2,建表的sql--studentinfo和插入...

    Struts和Hibernate分页及查询

    分页查询可能涉及到`setFirstResult()`和`setMaxResults()`这两个Hibernate的Query方法,它们分别设置查询的起始位置和最大返回记录数。 4. **创建Action类**:在Struts框架中,Action类是处理用户请求的核心,它...

    Struts+Hibernate实现分页

    3. 在JSP中展示数据和分页链接,利用请求范围内的属性获取分页信息。 4. 使用JSTL标签处理条件判断和导航链接。 5. 更新或删除操作同样需要在Action中处理,并确保分页状态不会受到影响。 这样的分页实现保证了数据...

    hibernate实现分页

    【标题】:“Hibernate实现分页” 在Web应用程序开发中,数据分页是一种常见的需求,它有助于提高用户体验,尤其是在处理大量数据时。Hibernate作为一款流行的Java持久化框架,提供了多种方式来实现分页查询。本...

    java 实现的一个简单的hibernate分页类

    java 实现的一个简单的hibernate分页类 可以设置,从某一条开始取、显示的条数 不依赖struts spring

    hibernate分页查询功能

    通常,我们会创建一个PageBean类来封装分页信息,包括当前页、总页数、每页记录数、总记录数等。在这个例子中,PageBean没有给出详细内容,但一般会包含如`setCurrentPage(int currentPage)`、`setTotalPages(int ...

    完整Struts2 HIBERNATE实现分页

    根据提供的标题、描述以及部分内文,我们可以梳理出关于如何使用Struts2与Hibernate实现分页功能的关键知识点。 ### Struts2与Hibernate简介 - **Struts2**:这是一个基于MVC架构的开源Web框架,它能帮助开发者...

    关于Hibernate分页类和jdbc的sql分页完美融合

    为了解决这个问题,我们可以利用JDBC的SQL分页来直接在数据库层面进行分页,从而减少内存消耗。 在给定的"SuperHibernateEntityDao.java"文件中,可能包含了一个自定义的DAO基类,该类扩展了Hibernate的通用DAO操作...

    hibernate 通用分页

    "hibernate 通用分页"是Hibernate框架中一个重要的实用功能,主要用于处理大数据量的查询场景,避免一次性加载过多数据导致内存压力。在这个组件中,`Pagehelp.java`、`Page.java`和`tag.tld`是实现分页的关键文件。...

Global site tag (gtag.js) - Google Analytics