Java 17迁移后Hibernate生成SQL的Schema括号错误致MSSQL执行失败
解决Hibernate生成SQL时错误包裹Schema名称的问题
问题根源
Hibernate错误地将DevDatabase.dbo作为单一标识符整体包裹方括号,而SQL Server需要将数据库名(Catalog)和架构名(Schema)分别用方括号包裹,格式为[DevDatabase].[dbo].Users。
以下是几种可行修复方案:
正确拆分Catalog与Schema配置
不要将数据库名和架构名合并填写,而是分别指定:- 在配置文件中全局设置:
spring.jpa.properties.hibernate.default_catalog=DevDatabase spring.jpa.properties.hibernate.default_schema=dbo - 或在实体类的
@Table注解中单独指定:@Entity @Table(name = "Users", catalog = "DevDatabase", schema = "dbo") public class User { // 实体字段定义 }
配置后Hibernate会自动生成
[DevDatabase].[dbo].[Users]格式的合法SQL。- 在配置文件中全局设置:
自定义SQL Server方言
重写Hibernate的标识符处理逻辑,对包含.的标识符拆分后分别加方括号:import org.hibernate.dialect.SQLServerDialect; import org.hibernate.engine.jdbc.env.spi.IdentifierCaseStrategy; import org.hibernate.engine.jdbc.env.spi.IdentifierHelper; import org.hibernate.engine.jdbc.env.spi.IdentifierHelperBuilder; public class CustomSQLServerDialect extends SQLServerDialect { @Override public IdentifierHelper buildIdentifierHelper(IdentifierHelperBuilder builder, IdentifierCaseStrategy identifierCaseStrategy) { return new IdentifierHelper(builder) { @Override public String toQuotedIdentifier(String identifier) { if (identifier.contains(".")) { String[] parts = identifier.split("\\."); StringBuilder quoted = new StringBuilder(); for (String part : parts) { if (quoted.length() > 0) { quoted.append("."); } quoted.append("[").append(part).append("]"); } return quoted.toString(); } return super.toQuotedIdentifier(identifier); } }; } }然后在配置文件中指定自定义方言:
spring.jpa.properties.hibernate.dialect=com.yourpackage.CustomSQLServerDialect关闭全局标识符引号(仅适用于无特殊字符的对象名)
如果数据库、架构和表名均不含空格或特殊字符,可以关闭Hibernate的自动引号功能:spring.jpa.properties.hibernate.globally_quoted_identifiers=false此时生成的SQL为
DevDatabase.dbo.Users,SQL Server可正常识别。
内容的提问来源于stack exchange,提问作者Hareni
相关产品推荐
相关产品推荐

