我正在使用 Hibernate 5.2.10 持久保存 MySQL 数据库
子 table 游戏有几个特点:
首先它有一个由4列组成的复合主键,即leagueId,也是League的外键,seasonId,也是League的外键季节键,回合号,游戏号
其次,表的两个外键指向同一个表,即 Club.id:homeTeamId 和 awayTeamId。
我正在尝试查询俱乐部实体,但我不断收到相同的错误消息。
查询:
List<Game> gameList = session.createQuery("FROM Game g WHERE g.id.leagueId = 1L AND g.id.seasonId = 1L AND g.id.roundNo = 35 AND g.id.gameNo = 7")
.getResultList();
翻译成这样:
hibernate :选择game0_.gameNo为gameNo1_1_、game0_.leagueId为 leagueId2_1_、game0_.roundNo为roundNo3_1_、game0_.seasonId为seasonId4_1_、game0_.clubAway为clubAway5_1_、game0_.clubHome为clubHome6_1_、game0_.date为date7_1_ 、game0_.gameDescr 为 gameDesc8_1_、game0_.league 为 league9_1_、game0_.played 为 Play10_1_、game0_.postponed 为 postpon11_1_、game0_.season 为 season12_1_ 来自游戏 game0_,其中 game0_.leagueId=1 且 game0_.seasonId=1 且 game0_.roundNo= 35 和 game0_.gameNo=7
错误:
错误:“字段列表”中存在未知列“game0_.clubAway”
我认为错误可能是由于这两个外键指向同一个俱乐部表,但我很迷失,不知道如何解决这个问题。我认为我的实体类已正确映射。
游戏类
@Entity
@Table(name = "game")
public class Game implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
private GameId id;
@Temporal(TemporalType.DATE)
private Date date;
private Boolean postponed;
private Boolean played;
private String gameDescr;
private League league;
private Season season;
private Club clubHome;
private Club clubAway;
public Game() {
}
//unannotated getters and setters omitted for brevity
@ManyToOne
@JoinColumn(name="leagueId", referencedColumnName="id", table="League")
public League getLeague() {
return league;
}
@ManyToOne
@JoinColumn(name="seasonId", referencedColumnName="id", table="Season")
public Season getSeason() {
return season;
}
@ManyToOne
@JoinColumn(name="homeTeamId", referencedColumnName="id", table="Club")
public Club getClubHome() {
return clubHome;
}
@ManyToOne
@JoinColumn(name="awayTeamId", referencedColumnName="id", table="Club")
public Club getClubAway() {
return clubAway;
}
}
GameId 类:
@Embeddable
public class GameId implements Serializable{
private static final long serialVersionUID = 1L;
private Long leagueId;
private Long seasonId;
private Integer roundNo;
private Integer gameNo;
public GameId() {
}
//getters and setters omitted for brevity
@Override
public int hashCode() {
// code omitted for brevity
}
@Override
public boolean equals(Object obj) {
//code omitted for brevity
}
}
俱乐部类别:
@Entity
@Table(name = "Club")
public class Club implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String clubName;
private League league;
public Club() {
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}
//unannotated getters and setters omitted for brevity
@ManyToOne
@JoinColumn(name = "currentLeagueId")
public League getLeague() {
return league;
}
}
联赛级别:
@Entity
public class League implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String leagueName;
private String descr;
public League() {
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}
//unannotated getters and setters omitted for brevity
}
季节类别:
@Entity
@Table(name="season")
public class Season implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Integer yearBegin;
private Integer yearEnd;
private String descr;
public Season(){
}
@Id
@Column(name="id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}
//unannotated getters and setters omitted for brevity
}
此处显示的表是整个数据库的子集,该数据库由 7 个表组成,但我已经针对所有其他 6 个实体测试了查询,并且它们运行顺利。问题肯定出在 Game 实体中,但我不知道它出了什么问题。有人能解释一下这个问题吗?预先非常感谢所有提供帮助的人!
最佳答案
我找到了解决方案。这看起来很疯狂,但我所需要做的就是将 @EmbeddedId 注释从字段移动到 Game 类中的 getter。
现在游戏类是:
@Entity
@Table(name = "game")
public class Game implements Serializable {
private static final long serialVersionUID = 1L;
private GameId id;
@Temporal(TemporalType.DATE)
private Date date;
private Boolean postponed;
private Boolean played;
private String gameDescr;
private League league;
private Season season;
private Club clubHome;
private Club clubAway;
public Game() {
}
@EmbeddedId
public GameId getId() {
return id;
}
//everything else stays the same
关于java - Hibernate:错误 'foo' 中的未知列 'field list' - 从一个实体到同一父实体的两个 @ManyToOne 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44034629/