溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Hibernate分頁(yè)管理怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2021-12-06 09:16:42 來(lái)源:億速云 閱讀:150 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“Hibernate分頁(yè)管理怎么實(shí)現(xiàn)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Hibernate分頁(yè)管理怎么實(shí)現(xiàn)”吧!

Hibernate中,通過(guò)對(duì)不同數(shù)據(jù)庫(kù)的統(tǒng)一接口設(shè)計(jì),實(shí)現(xiàn)了透明化、通用化的分頁(yè)實(shí)現(xiàn)機(jī)制。

通過(guò)Criteria.setFirstResult和Criteria.setFetchSize方法設(shè)定分頁(yè)范圍,如:

Criteria criteria = session.createCriteria(TUser.class);  criteria.add(Expression.eq("age", "20"));  //從檢索結(jié)果中獲取第100條記錄開始的20條記錄  criteria.setFirstResult(100);  criteria.setFetchSize(20);

通過(guò)Query.setFirstResult和Query.setMaxResults方法也可以設(shè)定分頁(yè)范圍,如:

Query query = session.createQuery("from TUser");  query.setFirstResult(100);  query.setMaxResults(20);  // query.setFetchSize(20);  List list = query.list();

Hibernate中,抽象類org.hibernate.dialect.Dialect指定了所有底層數(shù)據(jù)庫(kù)的對(duì)外統(tǒng)一接口,通過(guò)針對(duì)不同數(shù)據(jù)庫(kù)提供相應(yīng)的Dialect實(shí)現(xiàn),數(shù)據(jù)庫(kù)之間的差異性得以消除,從而為上層機(jī)制提供了透明的、數(shù)據(jù)庫(kù)無(wú)關(guān)的存儲(chǔ)層基礎(chǔ)。對(duì)于分頁(yè)機(jī)制而言,Dialect中定義了一個(gè)方法如下:

/**    * Add a LIMIT clause to the given SQL SELECT    *    * @return the modified SQL    */   public String getLimitString(String querySelect, boolean hasOffset) {    throw new UnsupportedOperationException( "paged queries not supported" );   }    public String getLimitString(String querySelect, int offset, int limit) {    return getLimitString( querySelect, offset>0 );   }

此方法用于在現(xiàn)有Select語(yǔ)句基礎(chǔ)上,根據(jù)各個(gè)數(shù)據(jù)庫(kù)自身特性,構(gòu)造對(duì)應(yīng)的記錄返回限定子句。如MySQL中對(duì)應(yīng)的記錄限定子句為L(zhǎng)imit,Oracle中,通過(guò)rownum子句實(shí)現(xiàn)。MySQLDialect中的getLimitString實(shí)現(xiàn):

public String getLimitString(String sql, boolean hasOffset) {    return new StringBuffer( sql.length()+20 )     .append(sql)     .append( hasOffset ? " limit ?, ?" : " limit ?")     .toString();   }

MySQLDialect.getLimitString方法的實(shí)現(xiàn)實(shí)際上是在給定的Select語(yǔ)句后追加MySQL所提供的專有SQL子句limit來(lái)實(shí)現(xiàn)。

Oracle9Dialect中的getLimitString實(shí)現(xiàn):

public String getLimitString(String sql, boolean hasOffset) {        sqlsql = sql.trim();    boolean isForUpdate = false;    if ( sql.toLowerCase().endsWith(" for update") ) {     sqlsql = sql.substring( 0, sql.length()-11 );     isForUpdate = true;    }        StringBuffer pagingSelect = new StringBuffer( sql.length()+100 );    if (hasOffset) {     pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");    }    else {     pagingSelect.append("select * from ( ");    }    pagingSelect.append(sql);    if (hasOffset) {     pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?");    }    else {     pagingSelect.append(" ) where rownum <= ?");    }     if ( isForUpdate ) {     pagingSelect.append( " for update" );    }        return pagingSelect.toString();   }

通過(guò)Oracle特有的rownum子句來(lái)實(shí)現(xiàn)數(shù)據(jù)部分的讀取。SQLServerDialect中的getLimitString實(shí)現(xiàn):

public String getLimitString(String querySelect, int offset, int limit) {    if ( offset > 0 ) {     throw new UnsupportedOperationException( "sql server has no offset" );    }    return new StringBuffer( querySelect.length()+8 )     .append(querySelect)     .insert( getAfterSelectInsertPoint(querySelect), " top " + limit )     .toString();   }

通過(guò)SQLServer特有的top子句實(shí)現(xiàn)。HSQLDialect中的getLimitString實(shí)現(xiàn):

public String getLimitString(String sql, boolean hasOffset) {    return new StringBuffer( sql.length() + 10 )      .append( sql )      .insert( sql.toLowerCase().indexOf( "select" ) + 6, hasOffset ? " limit ? ?" : " top ?" )      .toString();   }


大多數(shù)主流數(shù)據(jù)庫(kù)都提供了數(shù)據(jù)部分讀取機(jī)制,而對(duì)于某些沒(méi)有提供相應(yīng)機(jī)制的數(shù)據(jù)庫(kù)而言,Hibernate也通過(guò)其他途徑實(shí)現(xiàn)了分頁(yè),如通過(guò)Scrollable ResultSet,如果JDBC不支持Scrollable ResultSet,Hibernate也會(huì)通過(guò)ResultSet的next方法進(jìn)行記錄定位。Hibernate通過(guò)底層對(duì)分頁(yè)機(jī)制的良好封裝,使得開發(fā)人員無(wú)需關(guān)心數(shù)據(jù)分頁(yè)的細(xì)節(jié)實(shí)現(xiàn),將數(shù)據(jù)邏輯和存儲(chǔ)邏輯分離開來(lái),在提高生產(chǎn)效率的同時(shí),也大大加強(qiáng)了系統(tǒng)在不同數(shù)據(jù)庫(kù)平臺(tái)之間的可移植性。

到此,相信大家對(duì)“Hibernate分頁(yè)管理怎么實(shí)現(xiàn)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI