Hibernate實(shí)現(xiàn)分頁查詢的原理分析
Hibernate 可以實(shí)現(xiàn)分頁查詢,例如:
代碼
那么Hibernate底層如何實(shí)現(xiàn)分頁的呢?實(shí)際上Hibernate的查詢定義在net.sf.hibernate.loader.Loader這個(gè)類里面,仔細(xì)閱讀該類代碼,就可以把問題徹底搞清楚。 Hibernate2.0.3的Loader源代碼第480行以下:
代碼
如果相應(yīng)的數(shù)據(jù)庫定義了限定查詢記錄的sql語句,那么直接使用特定數(shù)據(jù)庫的sql語句。 然后來看net.sf.hibernate.dialect.MySQLDialect:
代碼
這是MySQL的專用分頁語句,再來看net.sf.hibernate.dialect.Oracle9Dialect:
代碼
Oracle采用嵌套3層的查詢語句結(jié)合rownum來實(shí)現(xiàn)分頁,這在Oracle上是最快的方式,如果只是一層或者兩層的查詢語句的rownum不能支持order by。 除此之外,Interbase,PostgreSQL,HSQL也支持分頁的sql語句,在相應(yīng)的Dialect里面,大家自行參考。 如果數(shù)據(jù)庫不支持分頁的SQL語句,那么根據(jù)在配置文件里面
代碼
如果支持scrollable result,使用ResultSet的absolute方法直接移到查詢起點(diǎn),如果不支持的話,使用循環(huán)語句,rs.next一點(diǎn)點(diǎn)的移過去。 可見使用Hibernate,在進(jìn)行查詢分頁的操作上,是具有非常大的靈活性,Hibernate會首先嘗試用特定數(shù)據(jù)庫的分頁sql,如果沒用,再嘗試Scrollable,如果不行,最后采用rset.next()移動的辦法。 在查詢分頁代碼中使用Hibernate的一大好處是,既兼顧了查詢分頁的性能,同時(shí)又保證了代碼在不同的數(shù)據(jù)庫之間的可移植性。 |
posted on 2007-06-13 11:10 好學(xué)蜘蛛 閱讀(241) 評論(0) 編輯 收藏 所屬分類: JAVA 、hibernate