好像是不支持的,hibernate把sybase和sqlserver归为一类,使用的是同一个SybaseDialect类,没有实现getLimitString()方法,不知为何?
Hibernate List分页通常情况下采用JDBC2.0 scrollable Result来实现的。
Query q = sess.createQuery("from DomesticCat cat");
q.setFirstResult(20);
q.setMaxResults(10);
List cats = q.list();
Hibernate会自动根据dialect使用不同的方法:
对支持游标的使用游标
对Mysql使用limit ?,?
public boolean supportsLimit() { return true; } public String getLimitString(String sql) { StringBuffer pagingSelect = new StringBuffer(100); pagingSelect.append(sql); pagingSelect.append(" limit ?, ?"); return pagingSelect.toString(); } <p>
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(); } <p>
如果不支持的就采用scrollable resultset
在Oracle上采用这种嵌套三层的sql语句来实现分页,我过去曾经在Oracle8i上做过测试,由于嵌套层次太多,效率其实很差。不过听说Oracle9i又优化过,可能性能有提高也说不定,我没用用过9i。找个时间来测一下Oracle分页的效率。
猜你喜欢
本站原创《复杂软件设计之道:领域驱动设计全面解析与实战》