Spring Boot实体类使用Oracle关键字desc作为字段名时表无法创建如何解决
解决方案
问题的根本原因是desc属于Oracle的保留关键字,JPA默认生成建表SQL时会直接将字段名作为列名传入,Oracle会将其识别为语法关键字而非字段标识符,最终导致表创建失败。可以通过以下几种方式解决:
- 方案1:单个字段强制指定带引号的列名
直接在desc字段上添加@Column注解,指定列名时用双引号包裹,强制JPA将其作为普通标识符传递给Oracle,修改后的字段代码如下:
完整的实体类示例:@Column(name = "\"desc\"") String desc;@AllArgsConstructor @NoArgsConstructor @Data @Entity public class Product { @Id @GeneratedValue(strategy = GenerationType.AUTO) Integer pid; String name; @Column(name = "\"desc\"") String desc; double price; } - 方案2:开启全局标识符自动引用
如果项目中存在大量需要使用保留关键字作为字段名的场景,可以在JPA配置中开启全局自动引号配置,无需单独为每个字段加注解。以Spring Boot+Hibernate环境为例,在application配置文件中添加如下配置即可:
properties格式:spring.jpa.properties.hibernate.globally_quoted_identifiers=true
yml格式:
开启后Hibernate会自动为所有表名、字段名添加双引号,避免保留关键字冲突。spring: jpa: properties: hibernate: globally_quoted_identifiers: true - 方案3:修改列名规避关键字
如果业务上允许调整数据库列名,可以直接将数据库列名改为非保留关键字(比如description),实体类对应字段也同步修改,无需额外配置即可正常运行。
内容的提问来源于stack exchange,提问作者PKS
相关产品推荐
相关产品推荐

