调用getResultList时Hibernate原生SQL移除Schema反斜杠如何解决
解决方案:Hibernate查询SQL Server含反斜杠schema丢失特殊字符问题
根因说明
Hibernate原生查询解析器默认会对SQL字符串做转义和标识符解析处理,会把方括号识别为特殊边界符号、把反斜杠识别为转义符自动消去,最终发送给SQL Server驱动的SQL就会丢失方括号和反斜杠,导致对象名无效。
可用解决方案
- 方案1:关闭Hibernate原生SQL自动转义(最直接)
直接在Hibernate配置中关闭原生SQL的自动转义功能,你的原生SQL会原封不动发送给JDBC驱动:
如果你用Spring Boot,在application.properties中添加配置:
如果你用原生Hibernate配置文件,在spring.jpa.properties.hibernate.native_sql.escaping_enabled=falsehibernate.cfg.xml中添加:<property name="hibernate.native_sql.escaping_enabled">false</property> - 方案2:用双引号包裹schema + 开启QUOTED_IDENTIFIER
不修改全局配置的前提下,调整你的SQL语句写法:
SQL Server开启// Java字符串中双引号和反斜杠都需要二次转义 String sql = "SET QUOTED_IDENTIFIER ON; SELECT * FROM \"TEAM\\\\Username\".tableName";QUOTED_IDENTIFIER后,双引号包裹的内容会被识别为标识符,不会被Hibernate解析为占位符。 - 方案3:开启全局标识符自动引用
如果你项目中大量存在带特殊字符的schema/表名,可以开启Hibernate全局标识符引用配置,自动给所有标识符加双引号:spring.jpa.properties.hibernate.globally_quoted_identifiers=true
验证方法
配置Hibernate SQL打印参数,确认最终执行的SQL语句符合预期:
spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

