谁都知道Hibernate可以实现分页查询的功能,在以前robbin的帖子[url]http://www.iteye.com/topic/261[/url]也比较详细的说明过,但今天看了其中的源代码,还是不是很理解,主要是与JDBC对照而言。
实际上返回的sql语句大体机构是
所以在PreparedStatement执行的sql语句是选取前面的799990条记录给结果集ResultSet
上面的方法说明了先将结果集的位置确定好,然后在用下面的方法封装获取的分页结果集封装成集合返回
自此Hibernate分页完成.
[color=blue]
下面就是我的疑惑问题了:[/color][b][/b]
1、Hibernate中的ResultSet为什么在返回结果集很大的情况下,依然能正常应用,而同样用JDBC查询同样数目的记录集可能发生OutOfMemory异常?
2、从Hibernate显示的分页语句也是取前面N(top)条语句,Hibernate是否进行过其他处理,但从Hibernate源代码上看不出特别的处理内容。
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分页完成.
[color=blue]
下面就是我的疑惑问题了:[/color][b][/b]
1、Hibernate中的ResultSet为什么在返回结果集很大的情况下,依然能正常应用,而同样用JDBC查询同样数目的记录集可能发生OutOfMemory异常?
2、从Hibernate显示的分页语句也是取前面N(top)条语句,Hibernate是否进行过其他处理,但从Hibernate源代码上看不出特别的处理内容。
本文详细探讨了Hibernate中实现分页查询的过程,并对比了与JDBC分页的区别。通过源代码分析,解释了Hibernate如何高效地处理大量数据的分页查询,同时提出了几个关于Hibernate分页机制的问题。
1062

被折叠的 条评论
为什么被折叠?



