Hibernate呈现分页查询的思想分析.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Hibernate呈现分页查询的思想分析

Hibernate 能够呈现分页查询,例如: 从第2万条开端取出100条记录 [code:1]Query q = session.createQuery(from Cat as c); q.setFirstResult(20000); q.setMaxResults(100); List l = q.list();[/code:1] 那么Hibernate底层问号呈现分页的呢?实际上Hibernate的查询定义在net.sf.hibernate.loader.Loader那个类里面,仔细泛读该类代码Code,就能够把疑难问题彻底搞清楚。 Hibernate2.0.3的Loader源代码Code第480行以下: [code:1]if (useLimit) sql = dialect.getLimitString(sql); PreparedStatement st = session.getBatcher().prepareQueryStatement(sql, scrollable);[/code:1] 假如相应的数据库Databnse定义了限定查询记录的sql语句,那么直接应用特定数据库Databnse的sql语句。 然后来看net.sf.hibernate.dialect.Mysql数据库Dialect: [code:1]public boolean supportsLimit() { return true; } public String getLimitString(String sql) { StringBuffer pagingSelect = new StringBuffer(100); pagingSelect.append(sql); pagingSelect.append( limit ?, ?); return pagingSelect.toString(); }[/code:1] 这是Mysql数据库的专用分页语句,再来看net.sf.hibernate.dialect.Oracle数据库9Dialect: [code:1]public boolean supportsLimit() { return true; } public String getLimitString(String sql) { StringBuffer pagingSelect = new StringBuffer(100); pagingSelect.append(select * from ( select row_.*, rownum rownum_ from ( ); pagingSelect.append(sql); pagingSelect.append( ) row_ where rownum = ?) where rownum_ ?); return pagingSelect.toString(); }[/code:1] Oracle数据库采用嵌套3层的查询语句结合rownum来呈现分页,这在Oracle数据库上是最快的方法,假如只是一层或者两层的查询语句的rownum别支持order by。 除此之外,Interbase,PostgreSQL,HSQL也支持分页的sql语句,在相应的Dialect里面,大部份人自行参考。 假如数据库Databnse不支持分页的SQL语句,那么根据在配置文档里面 #hibernate.jdbc.use_scrollable_resultset true 默认是true,假如你不指定为false,那么Hibernate会应用JDBC2.0的scrollable result来呈现分页,看Loader第430行以下: [code:1]if ( session.getFactory().useScrollableResultSets() ) { // 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}[/code:1] 假如支持scrollable result,应用ResultSet的absolute窍门直接移到查询起点,假如不支持的话,应用循环语句,rs.next一点点的移过去。 可见应用Hibernate,在停止查询分页的操作上,是具有非比寻常大的灵活性,Hibernate会首先尝试用特定数据库Databnse的分页sql,假如没用

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档