尝试使用 JPA 查询 Postgres 数据库时收到错误。
学生.java:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Student {
@Id
@GeneratedValue
private Long id;
private String name;
private String passportNumber;
public Student() {
super();
}
public Student(Long id, String name, String passportNumber) {
super();
this.id = id;
this.name = name;
this.passportNumber = passportNumber;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassportNumber() {
return passportNumber;
}
public void setPassportNumber(String passportNumber) {
this.passportNumber = passportNumber;
}
}
应用程序属性:
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.show-sql=true
spring.datasource.url=jdbc:postgresql://localhost:5432/shorten-db
spring.datasource.username=my_user
spring.datasource.password=my_password
spring.datasource.initialization-mode=always
spring.datasource.initialize=true
spring.datasource.schema=classpath:/schema.sql
spring.datasource.continue-on-error=true
应用程序.yml:
spring:
datasource:
url: jdbc:postgresql://localhost:5432/shorten-db
username: my_user
password: my_password
driverClassName: org.postgresql.Driver
spring.datasource.schema=classpath:/schema.sql
引用此架构:
DROP TABLE student;
CREATE TABLE student
(
id varchar(100) NOT NULL,
name varchar(100) DEFAULT NULL,
passportNumber varchar(100) DEFAULT NULL,
PRIMARY KEY (id)
);
当我调用服务“/students”时:
@PostMapping("/students")
public ResponseEntity<Object> createStudent(@RequestBody Student student) {
Student savedStudent = studentRepository.save(student);
URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}")
.buildAndExpand(savedStudent.getId()).toUri();
return ResponseEntity.created(location).build();
}
我收到以下错误:
postgres-db | 2020-08-28 21:46:28.108 UTC [257] HINT: Perhaps you meant to reference the column "student0_.passportnumber".
postgres-db | 2020-08-28 21:46:28.108 UTC [257] STATEMENT: select student0_.id as id1_1_, student0_.name as name2_1_, student0_.passport_number as passport3_1_ from student student0_
如何实现消息中指定的提示也许您想引用列“student0_.passportnumber”
我没有明确指定 SQL 并尝试仅使用 JPA。我需要自定义查询还是应该修改学生实体?
最佳答案
JPA 期望列名称采用小写形式,并且每个单词用下划线分隔。这将转换为驼峰式 Java 变量名称。在你的例子中,你有java变量名称作为passportNumber,它转换为passport_number。可以通过三种方式解决这个问题:
将java变量重命名为passportnumber,意思是它是一个单词。不幸的是,它看起来不太好,因为它破坏了 java 的变量命名约定。
将表列重命名为passport_number,从而建立正确的JPA 连接。
使用 @Column(name="passportNumber") 注释您的 java 变量。
关于java - DB 列上的 Spring JPA 错误返回与列名称相关的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63641307/