JPA:java.sql.SQLSyntaxErrorException: Unknown column 'book0_.book_id' in 'field list'


一、结论

记住book0_表名是没有问题的;应该让含有大写的列名的@Colume(name = "全小写")

// 让含有大写的列名的`@Colume(name = "全小写"`)
@Column(name = "bookname")
private String bookName;

// 不含大写的就不用写,只要你和表中同名即可
private String author;

二、研究

让我们开启显示出错的sql语句spring.jpa.show-sql = true
在这里插入图片描述

1.不写@Colume()

mysql表:这列名大小写是不敏感的。
在这里插入图片描述

package com.sand.alphon.model;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import javax.persistence.*;

@Entity
@Table(name = "book")
@JsonIgnoreProperties({"handler","hibernateLazyInitializer"})
public class Book {
    // 图书馆登记书籍唯一id
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int bookId;

    // 书名,不唯一
    private String bookName;

    // 作者名
    private String author;

    // 出版时间,yyyy-mm-dd
    private String publicTime;

    // 出版社
    private String press;

    // 书籍所在图书馆地址(楼层-书架-书架上的书号)
    private String location;

    // 借阅状态: 0 :在馆可借   1:在馆预约   2:借出
    private int status;

    // 为了简单改成只有单个所属类别
    private String category;

    // 价格
    private double price;

    public Book() {
    }

    public int getBookId() {
        return bookId;
    }

    public void setBookId(int bookId) {
        this.bookId = bookId;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getPublicTime() {
        return publicTime;
    }

    public void setPublicTime(String publicTime) {
        this.publicTime = publicTime;
    }

    public String getPress() {
        return press;
    }

    public void setPress(String press) {
        this.press = press;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

在这里插入图片描述
可以看到整个列名就是book0_.book_id.前是表名,后是列名 。
book0_没有问题,这样映射的表名就这样。有问题的是book_id

是因为不写@Colume默认生成的是将列名其中的大写字母转换成带_的小写字母。而数据库就直接比_i,而不是I,所以就错咯。

2.@Colume写大写

@Column(name = "bookName")
private String bookName;

在这里插入图片描述

@Column(name = "bookName")中有大写字母。本来默认映射就是同private String bookName;一样的,当然继续错

3.@Colume都小写

// 让含有大写的列名的`@Colume(name = "全小写"`)
@Column(name = "bookname")
private String bookName;

// 不含大写的就不用写,只要你和表中同名即可
private String author;

在这里插入图片描述
在这里插入图片描述

成功!

记住book0_表名是没有问题的;应该让含有大写的列名的@Colume(name = "全小写")

发布了486 篇原创文章 · 获赞 204 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/sandalphon4869/article/details/105483380
今日推荐