SQLServer数据库之解决hibernate对Sql Server分页慢的问题
小标 2018-10-19 来源 : 阅读 1757 评论 0

摘要:本文主要向大家介绍了SQLServer数据库之解决hibernate对Sql Server分页慢的问题,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助。

本文主要向大家介绍了SQLServer数据库之解决hibernate对Sql Server分页慢的问题,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助。


一、hibernate分页 hibernate对MsSql的伪分页 分页是web项目中比不可少的一个功能,数据量大的时候不能全部展示必然要用到分页技术。相信大家对hibernate中的分页都不陌生: 


Java代码  



public Query setMaxResults(int maxResults);  
public Query setFirstResult(int firstResult);  



只要调用了这两个方法并设置好参数,hibernate自动分页完全屏蔽了底层数据库分页技术,这也是众多开发者喜欢hibernate的原因之一。 项目开发中遇到一个奇怪的问题。数据库采用的是Sql Server 2005,也设置了上面两个参数,可是每次发送到数据库端的SQL语句都是select top ....语句。即便是查询第10w条,也只有一个select top 语句,不免引起对hibernate实现sql server分页的怀疑。hibernate针对不同数据库实现的分页方法封装在对应数据库的方言里,通过getLimitString方法转化成对应数据库的分页算法。 以常见的Mysql数据库的方言MySQLDialect为例: 


Java代码  



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



采用了大家熟悉的mysql的limit进行分页。 Oracle数据库的方言Oracle9iDialect: 


Java代码  



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 <= 0="" 8="" 15="" rownum="" sql="" public="" string="" int="" if="" offset="" throw="" new="" query="" result="" is="" not="" return="" queryselect="" top="" limit="" class="" sqlserver2005dialect="" extends="" sqlserverdialect="" private="" supportsvariablelimit="new" param="" first="" void="" boolean="" protected="" static="" selectindex="" selectdistinctindex="=" :="" row_number="" orderbyindex="" must="" specify="" order="" statement="" to="" support="" operation="" with="" in="" server="" sqlorderby="" sqlremoveorderby="sql.substring(0," insertpoint="" temppagination="" by="" as="" select="" from="" where="" rownumber="">?  and RowNumber<=?")  
                .toString();  
    }  
}  




最后在配置hibernate的时候在 hibernate.cfg.xml 配置 dialect 使用自己的SQLServer2005Dialect类
 

      com.common.SQLServer2005Dialect


或在与spring的集成配置文件中
 
 com.common.SQLServer2005Dialect
在分页时,就可以达到很好的效率了。

第一页采用top分页,以后采用ROW_NUMBER分页第一页以上查询要求sql中必须含有排序子句。 这只是在项目过程中采用的sql server遇到的该问题,如果使用mysql,oracle则不会遇到这个问题。

本文由职坐标整理并发布,希望对同学们学习SQL Server有所帮助,更多内容请关注职坐标数据库SQL Server数据库频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程