2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

Hibernate 高級查詢技巧

 feimishiwo 2014-04-29

 

分頁查詢:
在應用系統(tǒng)開發(fā)中,尤其是Web應用系統(tǒng)開發(fā)中,數(shù)據(jù)分頁是一項普遍而又非常重要的非功能性的技術(shù)需求。因為它對于提高系統(tǒng)運行效率,以及減少客戶端與服務(wù)器間的通信量都有著非常非常重要的作用。但是數(shù)據(jù)分頁在系統(tǒng)實現(xiàn)中往往會帶來很大的工作量,在基于JDBC的程序中,更是如此,因為不同的數(shù)據(jù)庫提供了不同的數(shù)據(jù)分頁技術(shù)(比如MySQL通過它的Limit字句實現(xiàn)數(shù)據(jù)分頁,而Oracle通過它的rownum字句實現(xiàn)數(shù)據(jù)分頁),這不但給實現(xiàn)帶來了一定的困難,也為系統(tǒng)在不同數(shù)據(jù)間的移植帶來了問題。
Hibernate通過對不同的數(shù)據(jù)庫提供統(tǒng)一的接口設(shè)計,實現(xiàn)了通用化透明化的數(shù)據(jù)分頁機制,比如我們可以通過QBC查詢實現(xiàn)數(shù)據(jù)分頁。如下面代碼所示:
Criteria criteria=session.createCriteria(User.class);
criteria.add(Expression.eq(“age”,20));
//從檢索結(jié)果中獲取從第100條開始到第120條結(jié)束的20條記錄
criteria.setFirstResult(100);
criteria.setFetchSize(20);
同樣,在Query接口中也提供了與其一致的方法。
這是Hibernate API提供的數(shù)據(jù)分頁技術(shù),但是有時候我們需要針對某一個底層數(shù)據(jù)庫,提供應用系統(tǒng)統(tǒng)一的數(shù)據(jù)分頁機制。這時候我們可以通過實現(xiàn)Hibernate中的抽象類net.sf.hibernate.dialect.DialectHibernate3中為org.hibernate.dialect.Dialect,這個抽象類是Hibernate提供的本地方言類,在本地方言類中封裝了對各種不同的主流數(shù)據(jù)庫特性的實現(xiàn),如果需要針對某種數(shù)據(jù)庫提供方言類支持,可以在Hibernate主配置文件中通過配置來指定(配置hibernate.dialect元素),通過對不同的數(shù)據(jù)庫提供相應的dialect實現(xiàn),可以消除不同數(shù)據(jù)庫間的差異,從而在上層提供了一個透明的,數(shù)據(jù)庫無關(guān)的存儲層基礎(chǔ)。在Hibernate中提供的主要dialect實現(xiàn)見下表:
Hibernate SQL 方言 (hibernate.dialect)

RDBMS
方言
DB2
net.sf.hibernate.dialect.DB2Dialect
MySQL
net.sf.hibernate.dialect.MySQLDialect
SAP DB
net.sf.hibernate.dialect.SAPDBDialect
Oracle (所有版本)
net.sf.hibernate.dialect.OracleDialect
Oracle 9
net.sf.hibernate.dialect.Oracle9Dialect
Sybase
net.sf.hibernate.dialect.SybaseDialect
Sybase Anywhere
net.sf.hibernate.dialect.SybaseAnywhereDialect
Progress
net.sf.hibernate.dialect.ProgressDialect
Mckoi SQL
net.sf.hibernate.dialect.MckoiDialect
Interbase
net.sf.hibernate.dialect.InterbaseDialect
Pointbase
net.sf.hibernate.dialect.PointbaseDialect
PostgreSQL
net.sf.hibernate.dialect.PostgreSQLDialect
HypersonicSQL
net.sf.hibernate.dialect.HSQLDialect
Microsoft SQL Server
net.sf.hibernate.dialect.SybaseDialect
Ingres
net.sf.hibernate.dialect.IngresDialect
Informix
net.sf.hibernate.dialect.InformixDialect
FrontBase
net.sf.hibernate.dialect.FrontbaseDialect
下面我們主要看看通過Oracledialect實現(xiàn)提供的數(shù)據(jù)分頁機制,對于分頁機制而言,dialect中定義了一個方法public String getLimitString(String sql,boolean hasoffset),此方法用于現(xiàn)有的select語句基礎(chǔ)上,根據(jù)各數(shù)據(jù)庫自身特性,構(gòu)造對應記錄返回限定字句。下面是Oracle9iDialect中的getLimitString實現(xiàn),在Oracle中實現(xiàn)數(shù)據(jù)分頁機制是通過Oraclerownum字句實現(xiàn)的數(shù)據(jù)部分提取。
public String getLimitString(String sql,boolean hasoffset){
 StringBuffer pagesql=new StringBuffer(sql.length()+20);
 if(hasoffset){
    pagesql.append(“select * from (select row_.*,rownum rownum_ from(”);
 }
 else{
    pagesql.append(“select * from(”);
 }
 pagesql.append(sql);
 if(hasoffset){
    pagesql.append(“) row_ where rownum<=?) where rownum_>?”);
 }
else{
 pagesql.append(“) where rownum<=?”);
}
return pagesql.toString();
}
這樣Hibernate通過對底層分頁機制的封裝,使得開發(fā)人員無需關(guān)心數(shù)據(jù)分頁機制的細節(jié)實現(xiàn),在提高了生產(chǎn)效率的同時,也大大提高了數(shù)據(jù)庫間的可移植性。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多