Hibernate生成格式错误SQL发送至SQL Server问题求解
问题根因
你遇到的语法错误是旧版本Hibernate适配SQL Server的方言存在的分页SQL拼接bug:当你未给DetachedCriteria设置显式排序规则时,Hibernate会默认插入ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP)作为分页排序逻辑,但是生成SQL时没有正确处理别名和后续字段的分隔,导致两个字段的别名拼接成了非法字符串,触发语法错误。
可行解决方案
方案1:添加显式排序规则(最推荐)
分页查询本身就要求有固定排序规则,避免分页时出现数据重复、遗漏的问题,你只需要给Criteria添加任意业务合理的排序即可修复该问题:
// 示例:按邮件创建时间倒序排序,可替换为业务需要的字段 criteria.addOrder(Order.desc("createdate"));
添加排序后Hibernate会用你指定的字段生成分页排序逻辑,不会再触发默认CURRENT_TIMESTAMP对应的拼接bug。
方案2:升级或自定义Hibernate方言
如果你使用的是Hibernate 4.x及更早版本,内置的SQLServerDialect/SQLServer2008Dialect存在该分页拼接缺陷,可做如下调整:
- 升级Hibernate到5.x及以上稳定版本,使用官方适配的
SQLServer2012Dialect - 若无法升级Hibernate版本,可自定义方言类,重写分页SQL的生成逻辑,修复无排序场景下的拼接问题。
方案3:手动实现分页逻辑
如果上述方案都不适用,你可以拆分查询逻辑:先查符合条件的总记录数,再通过指定查询offset和limit的方式手动分页,或者先分页查询主键id列表,再通过id查询对应的实体数据,避开有问题的Criteria分页逻辑。
内容的提问来源于stack exchange,提问作者arunken
相关产品推荐
相关产品推荐

