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

Spring Boot初始化H2数据库失败,SQL语法异常求助

问题:Spring Boot集成H2数据库初始化数据时触发SQL语法错误

相关代码与配置

JPA实体类

@Entity
@Table(name = "addresses")
@Getter
@Setter
@NoArgsConstructor
public class AddressEntity {

  @Id
  @GeneratedValue
  private Long id;

  private String city;
  private String postalCode;
  private String street;
  private String houseNumber;

}

Spring Boot配置(application.yml)

spring:
  h2:
    console:
      enabled: true
      path: /h2
  datasource:
    url: jdbc:h2:mem:/testdB
    username: sa
    password:
    driverClassName: org.h2.Driver
  jpa:
    hibernate:
      ddl-auto: none
    generate-ddl: true
    defer-datasource-initialization: true
    database-platform: org.hibernate.dialect.H2Dialect
  sql:
    init:
      data-locations:
        - classpath:addresses.sql

初始化数据脚本(addresses.sql)

INSERT INTO ADDRESSES (ID, CITY, POSTAL_CODE, STREET, HOUSE_NUMBER)
VALUES (0, 'NYC', '10020', 'Main Street', '32 A');

错误信息

启动应用时抛出org.h2.jdbc.JdbcSQLSyntaxErrorException,具体提示:

expected "DIRECT, SORTED, DEFAULT, VALUES, SET, (, WITH, SELECT, TABLE, VALUES";

已知现象

  • 关闭数据初始化时,表可正常创建
  • 在H2控制台手动执行该SQL脚本,能成功插入数据

解决方案

1. 修正H2数据库URL格式

当前H2内存数据库URL存在格式错误,mem:后多了一个斜杠。正确的URL应为jdbc:h2:mem:testdB,修改后的数据源配置如下:

spring:
  datasource:
    url: jdbc:h2:mem:testdB

2. 排查SQL脚本格式问题

确保addresses.sql文件使用标准LF换行符,避免CRLF格式导致的解析异常;同时检查脚本末尾是否存在多余空行或特殊字符,保证SQL语句的完整性。

3. 调整JPA配置避免冲突

ddl-auto: none已禁用Hibernate的自动DDL生成,而generate-ddl: true是Spring自带的DDL生成逻辑,两者可能存在执行顺序冲突。建议将generate-ddl改为false,确保数据初始化脚本在表创建完成后执行:

spring:
  jpa:
    hibernate:
      ddl-auto: none
    generate-ddl: false
    defer-datasource-initialization: true
    database-platform: org.hibernate.dialect.H2Dialect

内容的提问来源于stack exchange,提问作者Luk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:00:11