Hibernate使用DetachedCriteria分页查询SQL Server报as附近语法错误
解决方案
你遇到的是Hibernate 4版本针对SQL Server生成带分页的Criteria查询时,SQL字符串拼接截断的已知bug,可按以下优先级尝试修复:
- 修正Hibernate方言配置
检查项目中Hibernate的方言配置,确认和你使用的SQL Server版本匹配:
如果你使用SQL Server 2008及以上版本,将方言改为org.hibernate.dialect.SQLServer2008Dialect,不要使用旧的SQLServerDialect(针对SQL Server 2000设计,分页逻辑存在兼容性问题)。 - 给Criteria添加显式排序规则
你当前的查询没有配置排序条件,Hibernate默认生成ORDER BY CURRENT_TIMESTAMP作为排序逻辑,这是触发拼接bug的常见条件。你可以手动给查询增加合法排序,比如按主键排序:
加入显式排序后,Hibernate生成分页SQL时就不会触发默认CURRENT_TIMESTAMP排序对应的拼接逻辑,即可避免截断错误。criteria.addOrder(Order.asc("cid")); - 升级Hibernate 4的小版本
如果你使用的是Hibernate 4.1/4.2的早期版本,这类Criteria分页拼接bug已经在后续维护版本中修复,你可以升级到Hibernate 4.3.x的最终稳定版本,即可原生解决该问题。 - 临时兼容方案
如果暂时无法修改版本和方言,可以先查询符合条件的主键集合,再对主键集合做内存分页后查询对应实体,或者改用原生SQL实现分页查询,避开DetachedCriteria的分页逻辑。
内容的提问来源于stack exchange,提问作者arunken
相关产品推荐
相关产品推荐

