Hibernate实现分页查询的扼要阐明
当前位置:以往代写 > JAVA 教程 >Hibernate实现分页查询的扼要阐明
2019-06-14

Hibernate实现分页查询的扼要阐明

Hibernate实现分页查询的扼要阐明

本文向各人先容Hibernate查询分页,大概许多几何人还不相识Hibernate查询分页,没有干系,下面有一个例子,从第2万条开始取出100笔记录看完本文你必定有不少收获,但愿本文能教会你更多对象。

Java代码

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行以下:

Java代码

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

假如相应的数据库界说了限定查询记录的sql语句,那么直接利用特定命据库的sql语句。

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

Java代码

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:

Java代码

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行以下:

Java代码

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<firstRow; m++ ); rs.next();;
}

假如支持scrollable result,利用ResultSet的absolute要领直接移到查询起点,假如不支持的话,利用轮回语句,rs.next一点点的移已往。

可见利用Hibernate,在举办查询分页的操纵上,是具有很是大的机动性,Hibernate会首先实验用特定命据库的分页sql,假如没用,再实验Scrollable,假如不可,最后回收rset.next()移动的步伐。

在查询分页代码中利用Hibernate查询分页的一大长处是,既分身了查询分页的机能,同时又担保了代码在差异的数据库之间的可移植性。

    关键字:

在线提交作业