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
测试通过