为什么这个 "syntax error at or near "user"" 错误尝试使用 JpaRepository 的 save() 方法插入新记录?

Why this "syntax error at or near "user"" error trying to insert a new record using the save() method from JpaRepository?

我正在使用 Spring Data JPAHibernate 开发一个 Spring 引导项目,但我尝试使用 JpaRepository 接口的 save() 方法执行简单的 INSERT 查询时发现一些困难.

作为数据库,我使用 PostgreSQL,这里我有以下 table:

CREATE TABLE IF NOT EXISTS public."User"
(
    id bigint NOT NULL,
    first_name character varying(50) COLLATE pg_catalog."default" NOT NULL,
    middle_name character varying(50) COLLATE pg_catalog."default",
    surname character varying(50) COLLATE pg_catalog."default" NOT NULL,
    sex "char" NOT NULL,
    birthdate date NOT NULL,
    tax_code character varying(255) COLLATE pg_catalog."default" NOT NULL,
    e_mail character varying(255) COLLATE pg_catalog."default" NOT NULL,
    contact_number character varying(50) COLLATE pg_catalog."default" NOT NULL,
    created_at timestamp without time zone NOT NULL,
    CONSTRAINT "User_pkey" PRIMARY KEY (id)
)

我已经在我的项目中映射到一个 User 实体 class,这个:

package com.easydefi.users.entity;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Data;

@Entity
@Table(name = "User")
@Data
public class User implements Serializable {
     
    private static final long serialVersionUID = 5062673109048808267L;
    
    @Id
    @Column(name = "id")
    private int id;
    
    @Column(name = "first_name")
    private String firstName;
    
    @Column(name = "middle_name")
    private String middleName;
    
    @Column(name = "surname")
    private String surname;
    
    @Column(name = "sex")
    private char sex;
    
    @Column(name = "birthdate")
    private Date birthdate;
    
    @Column(name = "tex_code")
    private String taxCode;
    
    @Column(name = "e_mail")
    private String eMail;
    
    @Column(name = "contact_number")
    private String contactNumber;
    
    @Column(name = "created_at")
    private Date createdAt;

    public User(String firstName, String middleName, String surname, char sex, Date birthdate, String taxCode,
            String eMail, String contactNumber, Date createdAt) {
        super();
        this.firstName = firstName;
        this.middleName = middleName;
        this.surname = surname;
        this.sex = sex;
        this.birthdate = birthdate;
        this.taxCode = taxCode;
        this.eMail = eMail;
        this.contactNumber = contactNumber;
        this.createdAt = createdAt;
    }
    
}

好的,我创建了这个 UserRepository 接口扩展了 JpaRepository 接口:

public interface UserRepository extends JpaRepository<User, Integer> {

}

目前它是空的,因为我正在尝试执行 save() 方法的第一次测试。

最后,我创建了这个简单的测试 class,其中包含一个方法来测试与将新记录插入 User table 相关的操作,这个:

@SpringBootTest()
@ContextConfiguration(classes = GetUserWsApplication.class)
@TestMethodOrder(OrderAnnotation.class)
public class UserRepositoryTest {
    
    @Autowired
    private UserRepository userRepository;
    
    @Test
    @Order(1)
    public void TestInsertUser()
    {
        User user = new User("Mario", null, "Rossi", 'M', new Date(), "XXX", "xxx@gmail.com", "329123456", new Date());
        
        userRepository.save(user);
        
        assertTrue(true);
        
    }

}

问题是执行此方法我在堆栈跟踪中获得以下 exception\error:

2021-11-03 12:19:28.563  WARN 8094 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 42601
2021-11-03 12:19:28.567 ERROR 8094 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : ERROR: syntax error at or near "user"
  Position: 13
2021-11-03 12:19:32.058  INFO 8094 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2021-11-03 12:19:32.065  INFO 8094 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2021-11-03 12:19:32.080  INFO 8094 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

问题是它谈到了“用户”处或附近的通用语法错误,但我不明白问题出在哪里。

问题是什么?我该如何修复它?我错过了什么?

在 Postgres 中,user 是保留的 SQL 关键字。您可以将 table 的名称更改为其他单词,或者您可以使用 "" 技巧,但我不推荐这样做。

“user”是 PostgresQL 中的保留关键字。要么将 table 的用户名更改为其他名称,要么使用双引号将其转义。

@Table(name = "\"User\"")