Hibernate5+sqlserver2008 分页问题

2/22/2017来源:ASP.NET技巧人气:1371



Hibernate 发布了最新版本 5.2,恰好公司要做个新项目,我是比较喜欢冒险的,所有决定采用 sPRing4+Hibernate5,各种搜索,各种配置之后,框架终于跑起来了,当测试到分页的时候出现了一个很意外的错误,下面详细描述下错误的过程

1、分页代码

public  List<Map<String,Object>> findByPageMap(final String hql, final Object[] params,    final int pageNo, final int maxResults)    throws Exception{   Query queryObject = getsession().createQuery(hql);   if (pageNo<1)    throw new Exception("pageNo 必须大于 0");   int firstResult=(pageNo-1)*maxResults;   if (params != null) {    for (int i = 0; i < params.length; i++) {     queryObject.setParameter(i, params[i]);    }   }   queryObject.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);   queryObject.setFirstResult(firstResult);    queryObject.setMaxResults(maxResults);    return  (List<Map<String,Object>>)queryObject.list();  }

很简单不必解释

(ps:原本使用Hibernate5.2 的,因为5.2有一些被取消的的方法例如setResultTransformer()我没找到替代的方法,所以放弃)

运行test测试,出现了一个很诡异的错误

ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper:131 - '@P0' 附近有语法错误。

输出的sql语句为 select        TOP ?  ticketsell0_.detail_id as detail_i1_1 from     TicketSell_detail ticketsell0_

以前从来没出现这个现象,

检查代码 没有可改之处

于是各种替换排除  把 阿里数据源换成c3p0  Hibernate5.2 降级 5.1  现象依旧

度娘也没有给出答案,最后目光放在了数据方言上

原来这么写的

hibernate.dialect=org.hibernate.dialect.SQLServerDialect

换框架之前 一直好使的,在翻看了源码后 发现Hibernate对sqlserver的版本进行了细化

于是改成

hibernate.dialect=org.hibernate.dialect.SQLServer2008Dialect

测试通过