尝试创建 OneToMany 关系后字段列表中的未知列
Unknown column in field list after trying to create OneToMany relationship
我正在尝试在休眠中创建 @OneToMany
关系。我需要为数据库中的每篇文章存储一个选民列表。每个投票都有一个 userId 和一个投票编号。我的项目编译并运行,但是当我尝试访问 @OneToMany
列时它不存在并在标题中抛出错误。
我在这里查看了其他一些问题,但其中 none 似乎回答了这个具体问题。我想使用一个列表,因为它使我的控制器更容易。
这是我的实体,我省略了 article 和 getter 和 setter 中的大部分字段,因为它们对这个问题并不重要。
文章:
@Entity
@Table(name="articles")
public class Article implements Serializable {
private static final long serialVersionUID = 2L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name = "votes")
private int votes;
@Column(name = "voters")
@ElementCollection
@OneToMany(mappedBy = "vote", cascade = CascadeType.ALL)
private List<Vote> voters = new ArrayList<>();
投票:
@Entity
@Table(name = "vote")
public class Vote {
public Vote(long userId, int vote){
setUserId(userId);
setVote(vote);
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@ManyToOne
private Article article;
@Column(name = "userId")
private long userId;
@Column(name = "vote")
private int vote; //either 1, 0, or -1
public long getId() {
return id;
}
错误:
java.sql.SQLSyntaxErrorException: Unknown column 'voters' in 'field list'
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-java-8.0.13.jar:8.0.13]
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.13.jar:8.0.13]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.13.jar:8.0.13]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:974) ~[mysql-connector-java-8.0.13.jar:8.0.13]
(the stack trace continues but I didn't think it was important)
仅当我尝试访问我的控制器中的列时 class 和查询期间才会出现此错误。
这是我要进行的查询:
@Modifying
@Transactional
@Query(value = "UPDATE articles SET voters = ?1 WHERE id = ?2", nativeQuery = true)
int updateArticleVoters(List<Vote> newVoters, long id);
我只需要一种在数据库中基本存储二维数组的方法。不知道有没有更简单的方法。
感谢您的帮助
第一个错误:不能在关联上使用@Column
,必须使用@JoinColumn
。
第二个错误:@OneToMany(mappedBy = "something")
表示 @JoinColumn
在另一个实体(拥有方)上。
第三个错误:@ElementCollection
意味着你想要一个非实体的集合(字符串、可嵌入或基本类型),但这里Vote
是一个实体。
Article
中的映射应该是:
@OneToMany(mappedBy = "article", cascade = CascadeType.ALL)
private List<Vote> voters = new ArrayList<>();
第四个错误:在您的 UPDATE
本机查询中,您不能设置 Article.voters
因为它不是列而是映射到多对一的 JPA 一对多集合Vote.article
。这是基本的 JPA,您最好在继续之前阅读有关 @ManyToOne
管理的文档。
我正在尝试在休眠中创建 @OneToMany
关系。我需要为数据库中的每篇文章存储一个选民列表。每个投票都有一个 userId 和一个投票编号。我的项目编译并运行,但是当我尝试访问 @OneToMany
列时它不存在并在标题中抛出错误。
我在这里查看了其他一些问题,但其中 none 似乎回答了这个具体问题。我想使用一个列表,因为它使我的控制器更容易。
这是我的实体,我省略了 article 和 getter 和 setter 中的大部分字段,因为它们对这个问题并不重要。
文章:
@Entity
@Table(name="articles")
public class Article implements Serializable {
private static final long serialVersionUID = 2L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name = "votes")
private int votes;
@Column(name = "voters")
@ElementCollection
@OneToMany(mappedBy = "vote", cascade = CascadeType.ALL)
private List<Vote> voters = new ArrayList<>();
投票:
@Entity
@Table(name = "vote")
public class Vote {
public Vote(long userId, int vote){
setUserId(userId);
setVote(vote);
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@ManyToOne
private Article article;
@Column(name = "userId")
private long userId;
@Column(name = "vote")
private int vote; //either 1, 0, or -1
public long getId() {
return id;
}
错误:
java.sql.SQLSyntaxErrorException: Unknown column 'voters' in 'field list'
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-java-8.0.13.jar:8.0.13]
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.13.jar:8.0.13]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.13.jar:8.0.13]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:974) ~[mysql-connector-java-8.0.13.jar:8.0.13]
(the stack trace continues but I didn't think it was important)
仅当我尝试访问我的控制器中的列时 class 和查询期间才会出现此错误。
这是我要进行的查询:
@Modifying
@Transactional
@Query(value = "UPDATE articles SET voters = ?1 WHERE id = ?2", nativeQuery = true)
int updateArticleVoters(List<Vote> newVoters, long id);
我只需要一种在数据库中基本存储二维数组的方法。不知道有没有更简单的方法。
感谢您的帮助
第一个错误:不能在关联上使用@Column
,必须使用@JoinColumn
。
第二个错误:@OneToMany(mappedBy = "something")
表示 @JoinColumn
在另一个实体(拥有方)上。
第三个错误:@ElementCollection
意味着你想要一个非实体的集合(字符串、可嵌入或基本类型),但这里Vote
是一个实体。
Article
中的映射应该是:
@OneToMany(mappedBy = "article", cascade = CascadeType.ALL)
private List<Vote> voters = new ArrayList<>();
第四个错误:在您的 UPDATE
本机查询中,您不能设置 Article.voters
因为它不是列而是映射到多对一的 JPA 一对多集合Vote.article
。这是基本的 JPA,您最好在继续之前阅读有关 @ManyToOne
管理的文档。