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
测试通过
新闻热点
疑难解答