温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Hibernate分页管理怎么实现

发布时间:2021-12-06 09:16:42 来源:亿速云 阅读:162 作者:iii 栏目:编程语言

本篇内容主要讲解“Hibernate分页管理怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Hibernate分页管理怎么实现”吧!

Hibernate中,通过对不同数据库的统一接口设计,实现了透明化、通用化的分页实现机制。

通过Criteria.setFirstResult和Criteria.setFetchSize方法设定分页范围,如:

Criteria criteria = session.createCriteria(TUser.class);  criteria.add(Expression.eq("age", "20"));  //从检索结果中获取第100条记录开始的20条记录  criteria.setFirstResult(100);  criteria.setFetchSize(20);

通过Query.setFirstResult和Query.setMaxResults方法也可以设定分页范围,如:

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

Hibernate中,抽象类org.hibernate.dialect.Dialect指定了所有底层数据库的对外统一接口,通过针对不同数据库提供相应的Dialect实现,数据库之间的差异性得以消除,从而为上层机制提供了透明的、数据库无关的存储层基础。对于分页机制而言,Dialect中定义了一个方法如下:

/**    * 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 );   }

此方法用于在现有Select语句基础上,根据各个数据库自身特性,构造对应的记录返回限定子句。如MySQL中对应的记录限定子句为Limit,Oracle中,通过rownum子句实现。MySQLDialect中的getLimitString实现:

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

MySQLDialect.getLimitString方法的实现实际上是在给定的Select语句后追加MySQL所提供的专有SQL子句limit来实现。

Oracle9Dialect中的getLimitString实现:

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();   }

通过Oracle特有的rownum子句来实现数据部分的读取。SQLServerDialect中的getLimitString实现:

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();   }

通过SQLServer特有的top子句实现。HSQLDialect中的getLimitString实现:

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();   }


大多数主流数据库都提供了数据部分读取机制,而对于某些没有提供相应机制的数据库而言,Hibernate也通过其他途径实现了分页,如通过Scrollable ResultSet,如果JDBC不支持Scrollable ResultSet,Hibernate也会通过ResultSet的next方法进行记录定位。Hibernate通过底层对分页机制的良好封装,使得开发人员无需关心数据分页的细节实现,将数据逻辑和存储逻辑分离开来,在提高生产效率的同时,也大大加强了系统在不同数据库平台之间的可移植性。

到此,相信大家对“Hibernate分页管理怎么实现”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI