java - DB 列上的 Spring JPA 错误返回与列名称相关的错误

标签 java spring postgresql spring-boot jpa

尝试使用 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。可以通过三种方式解决这个问题:

  1. 将java变量重命名为passportnumber,意思是它是一个单词。不幸的是,它看起来不太好,因为它破坏了 java 的变量命名约定。

  2. 将表列重命名为passport_number,从而建立正确的JPA 连接。

  3. 使用 @Column(name="passportNumber") 注释您的 java 变量。

关于java - DB 列上的 Spring JPA 错误返回与列名称相关的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63641307/

相关文章:

java - 在上一个线程完成工作之前启动下一个线程

java - JPA 枚举类型映射。最佳方法

Java 泛型 - 为什么 <Object> = new <specialization> 不允许?

java - 如何从注解配置的Mybatis映射器读取生成的sql语句

python - Django错误-django.db.utils.DataError : value too long for type character varying(1)

java - 使用 LibSVM 的 Java 代码中的 Weka 错误 "cannot handle numeric class"

java - 在 DispatcherServlet 中未找到名称为 'dispatcher' 的 URI [/Spring4MVCHelloWorld/hello/] 的 HTTP 请求的映射

java - QueryDsl SpringData Jpa findAll 如何避免count()

sql - 将具有一个时间戳和对应的 x 整数数组的一行显示为具有 x 个时间戳和一个对应整数的 x 行

python - 如何使用python从postgresql中选择像100这样没有[(100),]的数据?