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

Spring Boot整合PostgreSQL遇DDL错误:syntax error at or near 'user'

解决PostgreSQL + Spring Boot中'syntax error at or near "user"'的DDL错误

嘿,这个问题我太熟悉了!你遇到的这个错误,根源在于PostgreSQL把USER当作了保留关键字——当Hibernate自动生成DDL语句时,直接用USER作为表名,Postgres会误以为你在使用关键字,自然就抛出语法错误了。

下面给你两种简单有效的解决办法:

方法1:给实体类指定非关键字的表名

最直接的方式是通过@Table注解给你的User实体指定一个合法的表名,比如app_user或者system_user,避开PostgreSQL的保留关键字:

@Entity
@Table(name = "app_user") // 这里替换成你想要的表名
public class User implements UserDetails {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id", nullable = false, updatable = false)
    private Long id;
    private String username;
    private String password;
    private String firstName;
    private String lastName;
    @Column(name="email", nullable = false, updatable = false)
    private String email;
    private String phone;
    private boolean enabled=true;
    // 其他字段、getter/setter、UserDetails接口方法实现...
}

如果你非要用user作为表名,也可以给表名加上双引号(PostgreSQL中带双引号的标识符会区分大小写,注意保持一致性):

@Entity
@Table(name = "\"user\"") // 双引号包裹,强制Postgres识别为表名
public class User implements UserDetails {
    // ... 你的实体代码
}

方法2:配置JPA自动转义关键字

你也可以在application.properties(或application.yml)中添加配置,让Spring Data JPA自动对关键字进行转义处理:

# application.properties
spring.jpa.properties.hibernate.globally_quoted_identifiers=true

这个配置会让Hibernate给所有生成的表名、列名都加上双引号,从而避开关键字冲突。不过这种方式会让所有标识符都变成大小写敏感的,需要注意后续的SQL查询也要保持一致的大小写。

总结一下,最推荐的还是方法1——直接用非关键字的表名,既能避免冲突,也不会引入大小写敏感的问题,后续维护起来更省心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:48:29