首页 > 解决方案 > 尝试创建 OneToMany 关系后字段列表中的未知列

问题描述

我正在尝试@OneToMany在休眠中创建关系。我需要为数据库中的每篇文章存储选民列表。每个投票都有一个 userId 和一个投票编号。我的项目编译并运行,但是当我尝试访问该@OneToMany列时它不存在并在标题中引发错误。

我在这里查看了其他一些问题,但似乎没有一个问题能回答这个具体问题。我想使用一个列表,因为它使我的控制器更容易。

这是我的实体,我省略了 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)

该错误仅在我尝试访问控制器类中的列和查询期间发生。

这是我要进行的查询:

@Modifying
@Transactional
@Query(value = "UPDATE articles SET voters = ?1 WHERE id = ?2", nativeQuery = true)
int updateArticleVoters(List<Vote> newVoters, long id);

我只需要一种在数据库中基本上存储二维数组的方法。我不知道是否有更简单的方法来做到这一点。

谢谢你的帮助

标签: spring-data-jpaone-to-manyhibernate-mapping

解决方案


第一个错误:你不能@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在继续之前阅读有关管理的文档。

例如。https://www.baeldung.com/jpa-joincolumn-vs-mappedby


推荐阅读