`
cats_tiger
  • 浏览: 276484 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate Dialect for SqlServer2005

阅读更多
Hibernate一直没有提供针对SqlServer2005的Dialect,原有的SqlServerDialect不支持物理分页查询。最近经常使用SqlServer2005,所以就很想写一个使用SqlServer2005 ROW_NUMBER()函数实现limit查询的Dialect类。
下面这个类是使用ROW_NUMBER()函数分页的Dialect,开始是从NHibernate移植的,后来又参考了Hibernate的Jira(http://opensource.atlassian.com/projects/hibernate/browse/HHH-2655)。不知道为什,Jira上的那个有BUG类可以很简单的修改,但是却没人理会。所以我感觉下面这个类可能也存在问题,有兴趣的朋友帮忙测测。
public class SQLServer2005Dialect extends SQLServerDialect {
	public SQLServer2005Dialect() {
		super();

		registerColumnType(Types.VARCHAR, 1073741823, "NVARCHAR(MAX)");
		registerColumnType(Types.VARCHAR, 2147483647, "VARCHAR(MAX)");
		registerColumnType(Types.VARBINARY, 2147483647, "VARBINARY(MAX)");
	}
  /**
   * Add a LIMIT clause to the given SQL SELECT
   *
   * The LIMIT SQL will look like:
   *
   * WITH query AS
   * (SELECT TOP 100 percent ROW_NUMBER() OVER (ORDER BY orderby) as __hibernate_row_nr__, ... original_query)
   * SELECT *
   * FROM query
   * WHERE __hibernate_row_nr__ > offset AND __hibernate_row_nr__ <= offset + limit
   * ORDER BY __hibernate_row_nr__
   *
   * @param querySqlString The SQL statement to base the limit query off of.
   * @param offset         Offset of the first row to be returned by the query (zero-based)
   * @param limit           Maximum number of rows to be returned by the query
   * @return A new SQL statement with the LIMIT clause applied.
   */
  public String getLimitString(String querySqlString, int offset, int limit) {
   
    StringBuffer pagingBuilder = new StringBuffer();
    String orderby = getOrderByPart(querySqlString);
    String distinctStr = "";

    String loweredString = querySqlString.toLowerCase();
    String sqlPartString = querySqlString.trim();
    if (loweredString.trim().startsWith("select")) {
      int index = 6;
      if (loweredString.startsWith("select distinct")) {
        distinctStr = "DISTINCT ";
        index = 15;
      }
      sqlPartString = sqlPartString.substring(index);
    }
    pagingBuilder.append(sqlPartString);

    // if no ORDER BY is specified use fake ORDER BY field to avoid errors
    if (orderby == null || orderby.length() == 0) {
      orderby = "ORDER BY CURRENT_TIMESTAMP";
    }

    StringBuffer result = new StringBuffer();
    result.append("WITH query AS (SELECT ")
    .append(distinctStr)
    .append(" TOP 100 PERCENT ROW_NUMBER() OVER (") //使用TOP 100 PERCENT可以提高性能
    .append(orderby)
    .append(") AS __hibernate_row_nr__, ")
    .append(pagingBuilder)
    .append(") SELECT * FROM query WHERE __hibernate_row_nr__ >")
    .append(offset)
    .append(" AND __hibernate_row_nr__ <=")
    .append(offset + limit)
    .append(" ORDER BY __hibernate_row_nr__");
    
    return result.toString();
  }

  public boolean supportsLimit() {
    return true;
  }

  static String getOrderByPart(String sql) {
    String loweredString = sql.toLowerCase();
    int orderByIndex = loweredString.indexOf("order by");
    if (orderByIndex != -1) {
      // if we find a new "order by" then we need to ignore
      // the previous one since it was probably used for a subquery
      return sql.substring(orderByIndex);
    } else {
      return "";
    }
  }
}
分享到:
评论

相关推荐

    hibernate SQLServer2008Dialect

    SQLServer2008Dialect 优化了原来的分页查询数据方法以及在生成SQL时表后增加了with(nolock)

    使用hibernate对sqlserver 2005进行增删改查

    DatabaseName=test"),用户名("sa"),密码("518168"),驱动类("com.microsoft.sqlserver.jdbc.SQLServerDriver"),以及方言("org.hibernate.dialect.SQLServerDialect")。方言用于使Hibernate能够生成适应...

    hibernate3连接sql server的例子

    &lt;property name="hibernate.connection.url"&gt;jdbc:sqlserver://localhost:1433;databaseName=testDB &lt;property name="hibernate.connection.username"&gt;username &lt;property name="hibernate.connection.password"&gt;...

    hibernate 连接sqlserver2000

    对于SQL Server 2000,应使用`HibernateDialect`的子类,如`net.sf.hibernate.dialect.SQLServer2000Dialect`。 4. **JDBC版本**:由于SQL Server 2000使用的是JDBC 3.0,而较新的Java版本可能默认使用JDBC 4.x,...

    使用Hibernate访问sqlserver数据库

    &lt;property name="hibernate.connection.url"&gt;jdbc:sqlserver://localhost:1433;databaseName=testdb &lt;property name="hibernate.connection.username"&gt;username &lt;property name="hibernate.connection.password"&gt;...

    Spring集成Hibernate写SQLServer

    &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.SQLServer2012Dialect &lt;prop key="hibernate.show_sql"&gt;true &lt;value&gt;com/yourpackage/YourEntity.hbm.xml&lt;/value&gt; ``` 接下来,我们需要创建...

    sqlserver数据库SSH配置1

    SQLServer 数据库 SSH 配置详解 SQLServer 数据库 SSH 配置是将 SQLServer 数据库与 Secure Shell(SSH)协议集成,以实现加密的数据传输和身份验证。本文将详细介绍 SQLServer 数据库 SSH 配置的实现步骤和相关...

    Hibernate+c3p0连接池SQLServer 2000

    [http60-Processor1][org.hibernate.util.JDBCExceptionReporter][ERROR] - [Microsoft][SQLServer2000DriverforJDBC] Broken pipe ``` 这些异常通常意味着数据库连接被意外关闭或者重置了。 #### 三、配置详解 ...

    sqlserver以及mysql hibernate xml映射语句

    例如`jdbc:sqlserver://localhost:1433;DatabaseName=hibernate_first`。 - **`hibernate.connection.username`**:指定连接数据库的用户名。 - **`hibernate.connection.password`**:指定连接数据库的密码。 - **`...

    三步完成Hibernate + sql server200 + proxool连接池

    第一步:hibernate.cfg.xml 加入: &lt;property name="hibernate.proxool.pool_alias"&gt;dbpool&lt;/property&gt; ...jdbc:microsoft:sqlserver://243.155.187.236:1433;DatabaseName=study &lt;/driver-url&gt; &lt;driver-

    Hibernate不同数据库的连接及SQL方言

    首先,Hibernate提供了一些基本的数据库连接驱动程序,例如mysql、oracle、sqlserver等。这些驱动程序可以让Hibernate连接不同的数据库。但是,为了确保数据的正确性和一致性,Hibernate还需要使用不同的SQL方言来...

    hibernate连接mysql,oracle,sqlserver, access数据库包和方法

    &lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.SQLServer2012Dialect &lt;property name="hibernate.connection.driver_class"&gt;com.microsoft.sqlserver.jdbc.SQLServerDriver&lt;/property&gt; ...

    JBuilder+SQL Server开发hibernate

    hibernate.connection.url jdbc:jnetdirect:sqlserver://your_server:port;databaseName=your_database ``` 请根据实际的数据库连接信息替换`your_username`、`your_password`、`your_server`、`port`和`your_...

    hibernate中所有数据库方言

    - **SQL Server2005 Dialect**:针对SQL Server 2005版本的优化。 - **SQL Server2008 Dialect**:包含对SQL Server 2008特性的支持。 #### SAP DB - **SAPDB Dialect**:为SAP DB数据库提供方言支持。 #### ...

    SSH项目原本使用的sqlserver2005数据库现在改用MySql配置问题修改

    在将SSH项目从SQL Server 2005迁移至MySQL时,出现的“org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query”异常通常意味着数据访问层在尝试执行SQL查询时遇到了问题。...

    NHibernate+sqlserver练习

    在这个“NHibernate+sqlserver练习”项目中,我们将会探讨如何结合NHibernate和MVVM(Model-View-ViewModel)设计模式来实现基本的数据操作功能,包括增、删、改、查。 首先,我们要理解NHibernate的核心概念。它是...

    sqlserver2008数据库驱动jar包

    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connection conn = DriverManager.getConnection( "jdbc:sqlserver://localhost:1433;databaseName=myDatabase", "username", "password"); ...

    Liferay 6.1.0 在已运行的Tomcat安装-数据库为SQL Server 2005 Express

    hibernate.dialect=org.hibernate.dialect.SQLServerDialect jdbc.default.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc.default.url=jdbc:sqlserver://127.0.0.1:1433;databaseName=...

    Hibernate不同数据库的连接及SQL方言.pdf

    在示例错误信息中提到的“Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]'last_insert_id' 不是可以识别的函数名”,这是由于`last_insert_id`函数在SQL Server中并不...

Global site tag (gtag.js) - Google Analytics