为什么这个 "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 JPA 和 Hibernate 开发一个 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\"")
我正在使用 Spring Data JPA 和 Hibernate 开发一个 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\"")