You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:06:04