`
firebirdyuan
  • 浏览: 13400 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Hibernate分页源代码的疑惑?

阅读更多
谁都知道Hibernate可以实现分页查询的功能,在以前robbin的帖子http://www.iteye.com/topic/261也比较详细的说明过,但今天看了其中的源代码,还是不是很理解,主要是与JDBC对照而言。

Query q = session.createQuery("from Cat as c");
q.setFirstResult(20000);
q.setMaxResults(100);
List l = q.list()


if (useLimit) sql = dialect.getLimitString(sql);
PreparedStatement st = session.getBatcher().prepareQueryStatement(sql, scrollable);

实际上返回的sql语句大体机构是
select top 799990 字段名 from 表名 where 条件

所以在PreparedStatement执行的sql语句是选取前面的799990条记录给结果集ResultSet

下面的方法定义了游标是否能够移动:如果支持scrollable result,使用ResultSet的absolute方法直接移到查询起点,如果不支持的话,使用循环语句,rs.next一点点的移过去。
private void advance(final ResultSet rs, final RowSelection selection) throws SQLException {
    final int firstRow = getFirstRow( selection );
        if ( firstRow != 0 ) {
	    if ( getFactory().getSettings().isScrollableResultSetsEnabled() ) {
		// we can go straight to the first required row
		rs.absolute( firstRow );
	    }
	    else {
	       // we need to step through the rows one row at a time (slow)
		for ( int m = 0; m < firstRow; m++ ) rs.next();
	    }
        }
}

上面的方法说明了先将结果集的位置确定好,然后在用下面的方法封装获取的分页结果集封装成集合返回
final List results = new ArrayList();
for ( count = 0; count < maxRows && rs.next(); count++ ) {
    if ( log.isTraceEnabled() ) log.debug("result set row: " + count);
	Object result = getRowFromResultSet( rs,session,queryParameters,lockModeArray,
			optionalObjectKey,hydratedObjects,keys,returnProxies 
);
results.add( result );

自此Hibernate分页完成.

下面就是我的疑惑问题了:
[b][/b]
1、Hibernate中的ResultSet为什么在返回结果集很大的情况下,依然能正常应用,而同样用JDBC查询同样数目的记录集可能发生OutOfMemory异常?
2、从Hibernate显示的分页语句也是取前面N(top)条语句,Hibernate是否进行过其他处理,但从Hibernate源代码上看不出特别的处理内容。
分享到:
评论
2 楼 firebirdyuan 2008-04-20  
我也知道在Hibernate中的分页SQL语句采用了不同的写法,比如Oracle中的rowid,MySql中的limit以及MS SQL中的top等,我其实到Hibernate的源代码总看过,我觉得它的查询方法和JDBC没有什么区别(也许我没有看出来),所以才有这个疑问啊。
以MS SQL数据库为例:
Hibernate查询是先获取一个select top语句
if ( useLimit ) {
    sql = dialect.getLimitString( 
         sql.trim(), //use of trim() here is ugly?
	 useOffset ? getFirstRow(selection) : 0, 
	 getMaxOrLimit(selection, dialect) 
    );
}
sql = preprocessSQL( sql, queryParameters, dialect );



然会在org.Hibernate.loader.Loader类调用执行SQL的语句
final PreparedStatement st = prepareQueryStatement( queryParameters, false, session );
final ResultSet rs = getResultSet( st, queryParameters.hasAutoDiscoverScalarTypes(),
queryParameters.isCallable(), 
selection, session );

上面的getResultSet方法其实调用的是下面的内容
public ResultSet getResultSet(PreparedStatement ps) throws SQLException {
    //执行select top语句,返回结果集
    ResultSet rs = ps.executeQuery();
    //在这里可以取处结果集中任何记录字段值,大家可以试一试!
    resultSetsToClose.add(rs);
    logOpenResults();
    return rs;
}

从上可知也是JDBC的查询方法啊!

楼上说的是,在结果集中ResultSet中只存放着标识键或主键,那卫生么我也能在ResultSet rs = ps.executeQuery();的下面取出所有的结果集中的内容,当然你说的标识键(主键除外)。因此我才有疑问为什么在JDBC中查询能内存用光,而在Hibernate中查询中却不会发生这种现象。针对MS SQL的分页SQL语句采用的是选取top记录数,然后在移动游标来实现的。实现很纳闷啊!
1 楼 魔力猫咪 2008-04-18  
其实你根本没明白Hibernate分页是怎么回事情。
之所以会有select top 出现,是因为SQL Server2000自己不支持rowid。这是sql server2000专有的。你看看hibernate生成的oracle语句,根本就没有top。
hibernate根据hql生成sql的时候,需要根据不同数据库方言生成符合该数据库sql标准的语句。如果数据库支持rowid,那么优先使用rowid,然后是top方式,最后是用游标移过去。
Hibernate中的ResultSet为什么在返回结果集很大的情况下,依然能正常应用,而同样用JDBC查询同样数目的记录集可能发生OutOfMemory异常?
这是因为返回的只有记录的主键。你自己jdbc查询是把所有的记录都返回了。

相关推荐

    hibernate经典分页源代码

    综上所述,`hibernate经典分页源代码` 涉及到的技术点包括 Hibernate 的 Criteria API 和 HQL 分页,以及在 Struts 框架中使用 JSP 进行服务器端分页。通过理解并实践这些知识,开发者能够创建高效且易于维护的分页...

    精通Hibernate+源代码

    这包括HQL(Hibernate查询语言)和Criteria API的使用,以及如何进行关联查询、分页查询和动态查询。读者还将了解到如何处理多对一、一对多、多对多等关系映射。 在事务和缓存管理方面,书中详细阐述了Hibernate的...

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

    Hibernate是Java环境下一个开放源代码的对象关系映射(ORM)框架,它允许开发者将Java对象映射到关系型数据库中的表,以及从数据库表中映射到Java对象。分页功能则是为了提高应用程序性能而设计的一种技术,尤其是在...

    SSH分页源代码

    在这个"SSH分页源代码"中,我们可以深入理解如何在Java Web应用中实现数据的分页显示。 Spring框架作为整个应用的基石,提供了一个统一的入口点,管理了其他组件的生命周期和依赖关系。在分页场景中,Spring可以...

    struts + hibernate+sprig 的分页源代码

    综上所述,SSH框架集成的分页源代码涉及了多个层次的交互,从用户界面的请求到数据库的查询,再到结果的封装和展示,整个过程都需要精心设计和优化。理解并熟练掌握这些知识点,对于开发高效、健壮的Java Web应用至...

    java 分页源代码

    本示例中的“java 分页源代码”可能是一个实现简单分页功能的Java代码示例。下面将详细介绍分页的基本概念、常见实现方式以及与Java相关的技术点。 1. 分页概念: 分页是将大量的数据分为多个部分,每次只显示一...

    精通Hibernate源代码

    《精通Hibernate源代码》 Hibernate,作为Java领域中广受欢迎的对象关系映射(ORM)框架,使得开发者能够方便地在Java应用中操作数据库。通过深入理解Hibernate的源代码,开发者可以更好地掌握其工作原理,提高开发...

    Java分页源代码代码

    本项目提供了一套完整的Java分页源代码,包含与数据库交互的部分,使得开发者可以直接运行并学习。下面我们将深入探讨这个话题。 首先,分页的核心在于如何有效地将大量数据分割成小块,每次只加载一部分到内存中。...

    spring+hibernate 分页 +mysql

    1. **配置Hibernate**: 首先,我们需要在Spring配置文件中设置Hibernate的相关属性,包括数据源、SessionFactory和TransactionManager。 2. **定义实体类和映射**: 创建Java实体类,对应数据库中的表,并使用...

    三大框架下分页源代码

    在IT行业中,分页是一种常见的数据展示...以上就是三大框架下分页源代码的解析,涵盖了从数据查询、业务逻辑到视图展示的全过程。这种分页实现方式可以应用于大部分基于Spring、Struts2和Hibernate的企业级Web应用中。

    Hibernate3.2.6源代码以及英文api

    Hibernate是一个开源的对象关系映射(ORM)框架,它在Java编程中扮演着至关重要的角色,使得开发者能够以面向对象...通过深入学习其源代码和英文API,开发者能更好地理解和利用这个框架,从而提高开发效率和软件质量。

    完整Struts2 HIBERNATE实现分页

    - **hibernate.cfg.xml**:这是Hibernate的核心配置文件,用于配置数据源、方言等关键信息。 ```xml &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/...

    含分页核心源代码 struts2.1 + hibernate3.3 +spring2.5 + 仿Google数字分页

    这是一个基于SSH(Struts2、Hibernate3.3和Spring2.5)框架的项目,其中包含了一个实现仿Google数字分页功能的核心源代码。在这个项目中,开发者利用这些技术来构建一个具有高效分页能力的Web应用,以提高用户体验并...

    hibernate分页(Eclipse项目)

    【标题】:Hibernate分页(Eclipse项目) 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作。本项目主要关注如何在使用Hibernate时实现分页功能,这对于处理大数据集的Web应用尤其...

    Hibernate应用开发完全手册(源代码)

    压缩包中包含了第2章至第4章的源代码,这些章节通常会涵盖Hibernate的基础概念、配置、实体映射、查询语言以及事务管理等核心内容。 在第二章中,作者可能会详细讲解Hibernate的核心概念,包括ORM(对象关系映射)...

    基于hibernate_mysql分页通用源码

    PagingUtil.war很可能是整个分页应用的打包文件,包含了所有源代码、配置文件、库依赖等,用户可以直接部署并运行。 综上所述,这个项目提供了一个整合了Hibernate、MySQL、Struts2的分页工具示例,通过研究源码和...

    jsp分页详细源代码

    ### JSP分页源代码详解 #### 分页逻辑解析 在提供的代码片段中,可以看到一个名为`query`的公共方法,该方法接收一个`DTOBean`类型的参数`dto`,并执行一系列操作来实现分页查询。下面是对这段代码关键部分的详细...

    jsf开发的人员管理分页源代码crud

    在这个“人员管理分页源代码CRUD”项目中,开发者使用JSF来实现一个基本的人力资源管理系统,包括创建(Create),读取(Retrieve),更新(Update)和删除(Delete)功能,并且具备了分页功能,使得数据浏览更加高效。...

    java通用分页代码实例.rar

    - 数据源适配器:根据不同的数据库实现具体的分页查询逻辑。 - 分页结果:封装查询结果和分页信息,如总记录数、总页数等。 5. **最佳实践**: - 避免一次性加载大量数据,以免内存溢出。 - 在前端处理分页时,...

    java分页代码下载

    根据提供的文件信息,我们可以分析出该段代码是用于实现基于Java技术的Web应用程序中的分页功能。虽然这里的代码示例采用的是ASP.NET的语法结构,但我们可以从中抽取出与Java分页相关的概念和技术要点,并结合Java...

Global site tag (gtag.js) - Google Analytics