封装 sqlserver2005 以上的 hibernate 方言 Dialect

摘要: 在数据库的查询中,分页是必不可少的。在很久以前用 sqlserver 2000 的时候,经常用内存分页或者存储过程分页。但内存分页效率实在很低,而且只适合数据量小的情况 。 从sqlserver 2005 以上,分页查询就好做很多,提供了一个row_number, 这个做分页比较好用。当然你仍然可以利用存储过程,写一个公用的分页存储过程。具体我就不写了,原理很简单,传入要查询的SQL 语句,得到所有数据,根据PAGE SIZE 计算ROW_NUMBER, 然后再包装一个SQL语句就可以了。但这里是用Hibernate做,所以直接实现Hibernate Dialect 方言比较好

在数据库的查询中,分页是必不可少的。在很久以前用 sqlserver 2000 的时候,经常用内存分页或者存储过程分页。但内存分页效率实在很低,而且只适合数据量小的情况 。 从sqlserver 2005 以上,分页查询就好做很多,提供了一个row_number, 这个做分页比较好用。当然你仍然可以利用存储过程,写一个公用的分页存储过程。具体我就不写了,原理很简单,传入要查询的SQL 语句,得到所有数据,根据PAGE SIZE 计算ROW_NUMBER, 然后再包装一个SQL语句就可以了。但这里是用Hibernate做,所以直接实现Hibernate Dialect 方言比较好

package com.ruijie.spl.common.dialect;

/**
 * SQLServer2005的Dialect,主要封装2005的高效分页语句
 * 
 */
import org.hibernate.dialect.SQLServerDialect;

import com.ruijie.spl.common.exception.RgsplRuntimeException;

public class SQLServer2005Dialect extends SQLServerDialect {

	public SQLServer2005Dialect() {
		super();
	}

	public String getLimitString(String querySelect, int offset, int limit) {
		String[] querySelects = getQuerySelects(querySelect);
		StringBuffer result = new StringBuffer(querySelect.length() + 100);
		result.append("select * from(");
		result.append(querySelects[0]);
		result.append(",row_number()over(");
		result.append(querySelects[2]);
		result.append(") as row");
		result.append(querySelects[1]);
		result.append(") tmp where tmp.row between ");
		result.append(offset+1);
		result.append(" and ");
		result.append(limit);
		return result.toString();
	}

	// 通过sql语句,得到相应的select、from and where、order by三条语句
	private String[] getQuerySelects(String querySelect) {
		String[] result = new String[3];
		if (querySelect.indexOf(" from ") == -1
				|| querySelect.indexOf(" order by ") == -1) {
			throw new RgsplRuntimeException("不支持不带from和order by的分页查询语句");
		}
		String select = querySelect.substring(0, querySelect.indexOf(" from "));
//		while (select.endsWith(" ")) {
//			select.substring(0, select.length() - 1);
//		}
		result[0] = select;
		result[1] = querySelect.substring(querySelect.indexOf(" from "),
				querySelect.indexOf(" order by "));
		result[2] = querySelect.substring(querySelect.indexOf(" order by "));
		return result;
	}

	public boolean supportsLimitOffset() {
		return true;
	}

}



其实也是包装SQL语句而已,用来实现分页。当然是从hibernate 的sqldialect 上继承过出来的。例子中的异常类可以自己补上,或者换成你自己想要的异常类。

上一篇: ie下用脚本提交表单后,不能自动提示的问题
下一篇: Hibernate保存图片 文件 到数据库
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号