sqlserver2012 offset
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.dialect.pagination; import java.sql.PreparedStatement;
import java.sql.SQLException; import org.hibernate.engine.spi.RowSelection; /**
* LIMIT clause handler compatible with SQL Server 2012 and later.
*
* @author Chris Cranford
*/
public class SQLServer2012LimitHandler extends SQLServer2005LimitHandler {
// determines whether the limit handler used offset/fetch or 2005 behavior.
private boolean usedOffsetFetch; public SQLServer2012LimitHandler() { } @Override
public boolean supportsLimit() {
return true;
} @Override
public boolean supportsVariableLimit() {
return true;
} @Override
public String processSql(String sql, RowSelection selection) {
// SQLServer mandates the following rules to use OFFSET/LIMIT
// * An 'ORDER BY' is required
// * The 'OFFSET ...' clause is mandatory, cannot use 'FETCH ...' by itself.
// * The 'TOP' clause isn't permitted with LIMIT/OFFSET.
if ( hasOrderBy( sql ) ) {
if ( !LimitHelper.useLimit( this, selection ) ) {
return sql;
}
return applyOffsetFetch( selection, sql, getInsertPosition( sql ) );
}
return super.processSql( sql, selection );
} @Override
public boolean useMaxForLimit() {
// when using the offset fetch clause, the max value is passed as-is.
// SQLServer2005LimitHandler uses start + max values.
return usedOffsetFetch ? false : super.useMaxForLimit();
} @Override
public int convertToFirstRowValue(int zeroBasedFirstResult) {
// When using the offset/fetch clause, the first row is passed as-is
// SQLServer2005LimitHandler uses zeroBasedFirstResult + 1
if ( usedOffsetFetch ) {
return zeroBasedFirstResult;
}
return super.convertToFirstRowValue( zeroBasedFirstResult );
} @Override
public int bindLimitParametersAtEndOfQuery(RowSelection selection, PreparedStatement statement, int index)
throws SQLException {
if ( usedOffsetFetch && !LimitHelper.hasFirstRow( selection ) ) {
// apply just the max value when offset fetch applied
statement.setInt( index, getMaxOrLimit( selection ) );
return 1;
}
return super.bindLimitParametersAtEndOfQuery( selection, statement, index );
} private String getOffsetFetch(RowSelection selection) {
if ( !LimitHelper.hasFirstRow( selection ) ) {
return " offset 0 rows fetch next ? rows only";
}
return " offset ? rows fetch next ? rows only";
} private int getInsertPosition(String sql) {
int position = sql.length() - 1;
for ( ; position > 0; --position ) {
char ch = sql.charAt( position );
if ( ch != ';' && ch != ' ' && ch != '\r' && ch != '\n' ) {
break;
}
}
return position + 1;
} private String applyOffsetFetch(RowSelection selection, String sql, int position) {
usedOffsetFetch = true; StringBuilder sb = new StringBuilder();
sb.append( sql.substring( 0, position ) );
sb.append( getOffsetFetch( selection ) );
if ( position > sql.length() ) {
sb.append( sql.substring( position - 1 ) );
} return sb.toString();
} private boolean hasOrderBy(String sql) {
int depth = 0; String lowerCaseSQL = sql.toLowerCase(); for ( int i = lowerCaseSQL.length() - 1; i >= 0; --i ) {
char ch = lowerCaseSQL.charAt( i );
if ( ch == '(' ) {
depth++;
}
else if ( ch == ')' ) {
depth--;
}
if ( depth == 0 ) {
if ( lowerCaseSQL.startsWith( "order by ", i ) ) {
return true;
}
}
}
return false;
}
}
sqlserver2012 offset的更多相关文章
- sqlserver2012 offset分页
select ID,UserName from user order by ID OFFSET (10 * (50-1)) ROW FETCH NEXT 10 rows only
- SQLServer2012 分页语句执行分析
上一篇文章提到了,SQLServer2012在使用Offset,Fetch语句分页时,获取了大量不需要的数据,导致查询效率低的问题. 现在让我们来看看,究竟是什么导致SQLServer不能按需取数呢? ...
- SQLSERVER2012的分页新功能
SQLSERVER2012的分页新功能 简介 SQL Server 2012中在Order By子句之后新增了OFFSET和FETCH子句来限制输出的行数从而达到了分页效果.相比较SQL Server ...
- SQLServer2012 (非)聚集索引存储探究
SQLServer2012 (非)聚集索引存储探究 Author:zfive5(zidong) Email:zfive5@163.com 引子 因为写了前一篇文字<SQLServer2012 表 ...
- SQLSERVER2012里的扩展事件初尝试(下)
SQLSERVER2012里的扩展事件初尝试(下) SQLSERVER2012里的扩展事件初尝试(上) 我们继续文章扩展事件在Denali CTP3里的新UI(二)里的这个实验 脚本文件下载:http ...
- .NET Core使用EF分页查询数据报错:OFFSET语法错误问题
在Asp.Net Core MVC项目中使用EF分页查询数据时遇到一个比较麻烦的问题,系统会报如下错误: 分页查询代码: ) * condition.PageSize).Take(condition. ...
- SQLServer2012 表IAM存储结构探究
SQLServer2012 表IAM存储结构探究 Author:zfive5(zidong) Email: zfive5@163.com 引子 国庆节期间,一直在翻阅<程序猿的自我修养-链接.装 ...
- 虚拟数字存储表——SQLServer2012可高用
窗口函数之虚拟数字辅助表 数字辅助表是一个整数序列,可以用它来完成多种不同的查询任务.数字表有很多任务,如生成日期和时间值序列,及分裂值列表.通常,建议在数据库中保存这样一个永久表,并填充尽可能多的数 ...
- Kafka 如何读取offset topic内容 (__consumer_offsets)
众所周知,由于Zookeeper并不适合大批量的频繁写入操作,新版Kafka已推荐将consumer的位移信息保存在Kafka内部的topic中,即__consumer_offsets topic,并 ...
随机推荐
- CF_576D_Flights for Regular Customers_矩阵乘法+倍增floyd+bitset+bfs
CF_576D_Flights for Regular Customers_矩阵乘法+倍增floyd+bitset https://www.luogu.org/problemnew/show/CF57 ...
- WC2017游记
Day0 到杭州之后出了点锅换了辆车,等了好久才开= =到宿舍发现路由器就在房门口,稳啊,过了一会儿就连不上了= =而且只有门口那个连不上,可以连上楼下的= =之后干了啥也忘了…… Day1 上午直接 ...
- 「LuoguP3381」【模板】最小费用最大流
Description 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. Input 第一行包含四个正整数N.M.S.T,分别表 ...
- javascript之this指向
情况一: 如果一个函数中有this,但是没有被上一级调用,this指向window 例: function a(){ var num='11'; console.log(this.num); //u ...
- 【213】IDL函数汇总
名称 功能说明 类型 语法&举例 IDL_VALIDNAME 判断变量名是否有效,无效返回值为空或者自动修改 函数 DEFSYSV 自定义系统变量,全局变量 过程 MAKE_ARRA ...
- 任务49:Identity MVC:Model前端验证
任务49:Identity MVC:Model前端验证 前端验证使用的是jquery的validate的组件 _ValidationScriptsPartial.cshtml 在我们的layout里面 ...
- Golang项目的测试实践
Golang项目的测试实践 最近有一个项目,链路涉及了4个服务.最核心的是一个配时服务.要如何对这个项目进行测试,保证输出质量,是最近思考和实践的重点.这篇就说下最近这个实践的过程总结. 测试金字塔 ...
- bzoj 1874: [BeiJing2009 WinterCamp]取石子游戏【博弈论】
先预处理出来sg值,然后先手必败状态就是sg[a[i]]的xor和为0(nim) 如果xor和不为0,那么一定有办法通过一步让xor和为0,具体就是选一个最大的sg[a[i]],把它去成其他sg值的x ...
- 组合数学1.4&3.10 By cellur925
本文引用于清华大学出版社卢开澄.卢华明<组合数学第五版>. 今天我们稍微讨论下圆排列以及$n$对夫妻的问题. 1.4圆周排列 这个问题是:从$n$个人中取$r$个在圆周上,我们用$Q(n, ...
- 用sublime text3 直接编译C/C++,java
首先你得下载好 这是我之前安装codeblocks时留下的里面有cpp,c++,gcc,g++. 第二步就是建立环境变量 这三个配置完成就ok 了 然后进入sublime text 3中,找到工具(t ...