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 列名返回空集合

计算列上的 T-SQL 列别名 - 列名无效

带有 DB2 错误 SqlSyntaxErrorException 的 Spring JPA

Django ManyToMany 字段上的自定义列名

如何在 jsonb 列上使用 Spring JPA 进行查询?