我有以下查询,希望在单个选择请求中运行:
@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
为简单起见,在此问题中更改了表的原始名称,游戏是GamelistLeague,团队是TeamInfo,并且有BatterStats和PitcherStats而不是一个PlayerStats
日志中的第一个查询是上面这个问题中显示的查询(命名查询),如果我直接在数据库中执行查询,它将根据需要返回所有内容。
您遇到了一个众所周知的问题,也就是“ N + 1选择”。简而言之,当您选择父实体时,会发生“ N +
1选择”问题,并且hibernate将使用OneToOne对与父相关的子项进行附加选择。因此,如果您的数据库中有“
N”个父子记录,则hibernate将使所有父项具有一个选择,然后使每个子项处于单独的选择中,从而使N + 1个选择合计。
在hibernate状态下,有两种方法可以解决“ N + 1”问题:
1.“加入获取” 所有 OneToOne子级。
2.启用二级缓存,并在OneToOne子级上使用@Cache批注。
您的问题是您没有“加入”所有的OneToOne孩子。您必须“加入”所有对象,包括可传递的子代(从子代本身或集合中引用的实体)。
使OneToOne变得懒惰(因为默认情况下它很渴望)只是部分解决方案,因为仅当您访问子代上的某个getter时,hibernate才会为子代选择一个选项,但是从长远来看,它仍将使所有N个选择成为可能。
问题内容: 我有以下查询,希望在单个选择请求中运行: 问题在于,所有内容都是通过单独的多个查询获取的。我只希望在单个请求中获取团队和团队的球员以及每个球员的技能。但是取而代之的是,我有多个选择查询来获取每个球队,每个球员,每个球员的统计数据和技能。 以下是带有给定注释的实体: 游戏实体: 团队实体: 玩家实体: 您能指出犯下的错误吗?我需要一个选择查询来加载游戏,它是团队,团队的球员和每个球员的技
目前我正在研究聊天服务器/客户端项目。我正在努力使用 select 处理多个请求,我的服务器脚本使用 select 模块,但客户端脚本没有。结果是,当用户输入消息时,其他客户端必须编写自己的消息才能通读对话。我已经在网上搜索了很多示例,但只能找到带有 sys.stdin 的代码片段,这不是我想要的。 我很高兴收到任何指示/解释。 服务器代码: 客户端代码:
我希望在一个select请求中运行以下查询: 问题是所有内容都是由单独的多个查询获取的。我只希望团队和团队的球员和每个球员的技能在一个请求中被获取。但是相反,我有多个选择查询来获取每个团队、玩家、每个玩家的统计数据和技能。 以下是与注释一起使用的实体: 游戏实体: 团队实体: 玩家实体: 你能指出所犯的错误吗?我需要一个选择查询来加载游戏,它是团队、团队的球员和每个球员的技能。 编辑1:以下是po
我有一个项目,其中有N个参数的数组,需要调用endpointN次(每个参数调用一次)。然后,我需要在返回所有响应时进行监听,并且只在检索到所有结果时执行某个函数。 我知道如何在前端框架中实现上述内容,在前端框架中,我使用axios,然后将axios的响应存储在数组中(例如),然后执行 所以上面是我已经成功使用的东西。问题是,现在我需要在我的后端(我提到的是一个项目)中执行同样的操作。 下面给出了用
我创建了简单的应用程序来开始使用 socket.io,但是当我运行它时,Chrome(在其他浏览器中测试,结果相同)会吃掉我所有的 CPU 并发出许多请求: 我是套接字新手,但我肯定这不是它应该如何工作。在浏览器中运行的代码非常简单,它应该只连接到套接字并将所有接收到的数据记录到控制台: 索引.html 另外,我的服务器文件如下所示: 服务器.js 当我运行服务器时,我让,一切似乎都很好。但是当我
我想问一下,是否有人只能从表A中选择值。请参阅下面的hibernate代码 现在,它就像从A、B和C中选择值,而且太多了。 谢谢你吉米