Hibernate分页查询原理解读

替自已坚强

替自已坚强

2016-01-29 12:54

Hibernate分页查询原理解读,Hibernate分页查询原理解读
  Hibernate 可以实现分页查询,例如:
  从第2万条开始取出100条记录

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

  那么Hibernate底层如何实现分页的呢?实际上Hibernate的查询定义在net.sf.hibernate.loader.Loader这个类里面,仔细阅读该类代码,就可以把问题彻底搞清楚。

  Hibernate2.0.3的Loader源代码第480行以下:

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

  如果相应的数据库定义了限定查询记录的sql语句,那么直接使用特定数据库的sql语句。

  然后来看net.sf.hibernate.dialect.MySQLDialect:

  public boolean supportsLimit() {
  return true;
  }
  public String getLimitString(String sql) {
  StringBuffer pagingSelect = new StringBuffer(100);
  pagingSelect.append(sql);
  pagingSelect.append(" limit ?, ?");
  return pagingSelect.toString();
  }

  这是MySQL的专用分页语句,再来看net.sf.hibernate.dialect.Oracle9Dialect:

  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();
  }

  Oracle采用嵌套3层的查询语句结合rownum来实现分页,这在Oracle上是最快的方式,如果只是一层或者两层的查询语句的rownum不能支持order by。

  除此之外,Interbase,PostgreSQL,HSQL也支持分页的sql语句,在相应的Dialect里面,大家自行参考。

  如果数据库不支持分页的SQL语句,那么根据在配置文件里面

  #hibernate.jdbc.use_scrollable_resultset true

  默认是true,如果你不指定为false,那么Hibernate会使用JDBC2.0的scrollable result来实现分页,看Loader第430行以下:

  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  }

  如果支持scrollable result,使用ResultSet的absolute方法直接移到查询起点,如果不支持的话,使用循环语句,rs.next一点点的移过去。

  可见使用Hibernate,在进行查询分页的操作上,是具有非常大的灵活性,Hibernate会首先尝试用特定数据库的分页sql,如果没用,再尝试Scrollable,如果不行,最后采用rset.next()移动的办法。

  在查询分页代码中使用Hibernate的一大好处是,既兼顾了查询分页的性能,同时又保证了代码在不同的数据库之间的可移植性。
2005年3月29日 2005年3月28日 2005年3月28日 2005年3月28日 2005年3月28日 2005年3月28日 2005年3月27日 2005年3月27日 2005年3月26日 2005年3月26日 2005年3月26日 2005年3月26日
展开更多 50%)
分享

猜你喜欢

Hibernate分页查询原理解读

Java JAVA基础
Hibernate分页查询原理解读

jsp hibernate的分页代码

Web开发
jsp hibernate的分页代码

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

hibernate 命名查询如何实现

编程语言 网络编程
hibernate 命名查询如何实现

Hibernate 的原理与配置

Java JAVA基础
Hibernate 的原理与配置

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

口腔生理解读

生活常识
口腔生理解读

Ajax实现分页查询

Web开发
Ajax实现分页查询

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

JavaBean(EJB) 3.0 全新体验

JavaBean(EJB) 3.0 全新体验

基于Java的IDEA加密算法

基于Java的IDEA加密算法
下拉加载更多内容 ↓