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
測試通過
|
新聞熱點
疑難解答