【问题标题】:spring boot - com.mysql.jdbc.spring boot exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'customer0_.email' in 'field list'spring boot - com.mysql.jdbc.spring boot exceptions.jdbc4.MySQLSyntaxErrorException:“字段列表”中的未知列“customer0_.email”
【发布时间】:2016-12-08 17:43:31
【问题描述】:

我有两个表 User 和 Customer,它们从 MySQL 中的 User 扩展而来,在 Spring Data JPA 中实现,我创建了一个简单的 REST 控制器来测试将数据发布到数据库。

用户

package mk.klikniobrok.models;

import javax.persistence.*;
import java.io.Serializable;
import java.sql.Date;
import java.sql.Timestamp;

/**
 * Created by andrejnaumovski on 12/8/16.
 */

@Entity
@Table(name = "user")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class User {
    @Id
    private String username;
    private String password;
    private int enabled;
    @Column(name = "date_created", insertable = false, updatable = false)
    @Basic(optional = false)
    @Temporal(TemporalType.TIMESTAMP)
    private java.util.Date dateCreated;
    @Column(name = "last_used")
    @Temporal(TemporalType.TIMESTAMP)
    private java.util.Date lastUsed;
    @Enumerated
    private Role role;

    public User() {

    }

    public User(
            String username,
            String password,
            int enabled,
            java.util.Date dateCreated,
            java.util.Date lastUsed,
            Role role
    ) {
        this.username = username;
        this.password = password;
        this.enabled = enabled;
        this.dateCreated = dateCreated;
        this.lastUsed = lastUsed;
        this.role = role;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int isEnabled() {
        return enabled;
    }

    public void setEnabled(int enabled) {
        this.enabled = enabled;
    }

    @Column(name = "date_created")
    public java.util.Date getDateCreated() {
        return dateCreated;
    }

    public void setDateCreated(Timestamp dateCreated) {
        this.dateCreated = dateCreated;
    }

    @Column(name = "last_used")
    public java.util.Date getLastUsed() {
        return lastUsed;
    }

    public void setLastUsed(Timestamp lastUsed) {
        this.lastUsed = lastUsed;
    }

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }
}

客户

package mk.klikniobrok.models;

import javax.persistence.*;

/**
 * Created by andrejnaumovski on 12/8/16.
 */

@Entity
@Table(name = "customer")
public class Customer extends User {
    @Column(name = "email")
    private String email;
    @Column(name = "first_name")
    private String firstName;
    @Column(name = "last_name")
    private String lastName;
    @Column(name = "image_url")
    private String imageUrl;

    public Customer() {
        super();
    }

    public Customer(String username,
                    String password,
                    int enabled,
                    java.util.Date dateCreated,
                    java.util.Date lastUsed,
                    Role role,
                    String email,
                    String firstName,
                    String lastName,
                    String imageUrl
    ) {
        super(username, password, enabled, dateCreated, lastUsed, role);
        this.email = email;
        this.firstName = firstName;
        this.lastName = lastName;
        this.imageUrl = imageUrl;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getImageUrl() {
        return imageUrl;
    }

    public void setImageUrl(String imageUrl) {
        this.imageUrl = imageUrl;
    }
}

数据库架构:

CREATE TABLE `user` (
  `username` varchar(50) NOT NULL,
  `password` varchar(200) NOT NULL,
  `enabled` tinyint(1) NOT NULL,
  `date_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `last_used` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `role` varchar(50) NOT NULL,
  PRIMARY KEY (`username`)
)

CREATE TABLE `customer` (
  `username` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  `first_name` varchar(50) DEFAULT NULL,
  `last_name` varchar(50) DEFAULT NULL,
  `image_url` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`username`),
  UNIQUE KEY `email` (`email`),
  CONSTRAINT `customer_ibfk_1` FOREIGN KEY (`username`) REFERENCES `user` (`username`)
)

使用 Postman 向控制器发送 POST 请求,这是我得到的响应:

{
  "timestamp": 1481218619875,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "org.springframework.dao.InvalidDataAccessResourceUsageException",
  "message": "could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet",
  "path": "/customer/"
}

我得到的错误是:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'customer0_.date_created' in 'field list'

我在 StackOverflow 上检查了大多数答案,但问题似乎发生在连接表和其他更复杂的操作上,而不是这么简单。有什么建议吗?

【问题讨论】:

  • 表的架构是什么?
  • API 在做什么?
  • @AkashdeepSaluja 我已将架构添加到原始帖子中。 API 仅通过 CrudRepository 将简单的 POST 保存到数据库。
  • 只是一个疑问,如果您有两个表,为什么要使用鉴别器?我猜你很清楚它的存在。
  • @AkashdeepSaluja 我已经根据我的想法编辑了代码,除了现在我在另一个字段'customer0_.date_created'上遇到错误。

标签: java mysql spring spring-boot spring-data-jpa


【解决方案1】:

通过将 User 类上的 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 更改为 @Inheritance(strategy = InheritanceType.JOINED) 来解决此问题。

【讨论】:

    猜你喜欢
    • 2021-07-11
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多