DB 列上的 Spring JPA 错误返回与列名相关的错误
Posted
技术标签:
【中文标题】DB 列上的 Spring JPA 错误返回与列名相关的错误【英文标题】:Spring JPA error on DB column returns error related to column name 【发布时间】:2020-12-17 19:57:54 【问题描述】:我在尝试使用 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_
如何实现消息Perhaps you meant to reference the column "student0_.passportnumber"
中指定的提示我没有明确指定SQL 并尝试仅使用JPA。我需要自定义查询还是应该修改学生实体?
【问题讨论】:
【参考方案1】:JPA 要求列名采用小写形式,每个单词用下划线分隔。这转换为驼峰式 Java 变量名。在您的情况下,您的 java 变量名称为 passportNumber,它转换为 passport_number。解决方法有以下三种:
将java变量重命名为passportnumber,意思是一个单词。不幸的是,它看起来不太好,因为它违反了 java 的变量命名约定。
将表列重命名为 passport_number,从而建立正确的 JPA 连接。
使用 @Column(name="passportNumber") 注释您的 java 变量。
【讨论】:
以上是关于DB 列上的 Spring JPA 错误返回与列名相关的错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 Laravel 4 Eloquent 连接列上的列名“”无效?
Spring JPA/Hibernate findby 列名返回空集合