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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 02:50:10