【发布时间】:2015-03-12 05:06:29
【问题描述】:
我希望在单个选择请求中运行以下查询:
@NamedQuery(name=Game.GET_GAME_BY_ID1,
query = "SELECT g FROM Game g " +
"JOIN FETCH g.team1 t1 " +
"JOIN FETCH t1.players p1 " +
"JOIN FETCH p1.playerSkill skill1 " +
"where g.id=:id")
问题是所有内容都是通过单独的多个查询获取的。 我只希望在一个请求中获取团队和团队的球员以及每个球员的技能。但相反,我有多个选择查询来获取每个团队、球员、每个球员的统计数据和技能。
以下是与给定注释一起使用的实体:
游戏实体:
public class Game implements Serializable {
private Integer id;
private Integer dayNumber;
private Long date;
private Integer score1;
private Integer score2;
private Team team1;
private Team team2;
....
@ManyToOne(fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name="team_id1")
public Team getTeam1() {
return team1;
}
public void setTeam1(Team team1) {
this.team1 = team1;
}
// uni directional many to one association to Team
@ManyToOne(fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name="team_id2")
public Team getTeam2() {
return team2;
}
public void setTeam2(Team team2) {
this.team2 = team2;
}
}
团队实体:
public class Team implements Serializable {
...
private Set<Player> players;
...
@OneToMany(mappedBy="team", targetEntity=Player.class, fetch=FetchType.LAZY, cascade=CascadeType.ALL)
@Fetch(FetchMode.JOIN)
@OrderBy(value="batOrder, pitRotationNumber ASC")
public Set<Player> getPlayers() {
return players;
}
public void setPlayers(Set<Player> players) {
this.players = players;
}
}
玩家实体:
public class Player implements Serializable {
private PlayerStat playerStats;
private PlayerSkill playerSkill;
...
@OneToOne(mappedBy="player", cascade=CascadeType.ALL)
@Fetch(FetchMode.JOIN)
public PlayerStat getPlayerStats() {
return this.playerStats;
}
public void setPlayerStats(PlayerStat playerStats) {
this.PlayerStats = playerStats;
}
...
@OneToOne(mappedBy="player", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
@Fetch(FetchMode.JOIN)
public PlayerSkill getPlayerSkill() {
return this.playerSkill;
}
public void setPlayerSkill(PlayerSkill playerSkill) {
this.playerSkill = playerSkill;
}
}
您能指出所犯的错误吗? 我需要一个选择查询来加载游戏,它是球队、球队的球员和每个球员的技能。
编辑 1: 这是 postgresql 日志(其中的一部分),纯 sql 查询: http://pastebin.com/Fbsvmep6
为简单起见,此问题中更改了表的原始名称, Game 是 GamelistLeague,Team 是 TeamInfo,并且有 BatterStats 和 PitcherStats 而不是一个 PlayerStat
日志中的第一个查询是上面这个问题中显示的查询(命名查询),如果我直接在数据库中执行它,它会根据需要返回所有内容。
【问题讨论】:
-
能否请您发布正在执行的实际 SQL?如果关闭延迟获取会发生什么?
-
@chrylis 请查看编辑。我可以尝试关闭延迟获取,但稍后,虽然我需要将它设置为延迟以用于其他不应急切获取玩家的查询。
-
Hibernate...自 2001 年以来让聪明的人执行愚蠢的查询。可能是时候放弃 Hibernate 膨胀软件并切换到 something closer to the metal :)
-
@LanceJava 哈哈哈:D
-
我只是想对 Lance Java 说点什么。我打算放弃休眠并使用mybatis。天哪,我在冬眠,真傻。
标签: java hibernate jpa hql fetch