我有2个具有@OneToOne关系的模型。我们假设一个模型User
和一个模型Player
。每个用户都是玩家,每个玩家都是用户。
以下是这两个模型的代码:
@Entity
public class User extends Model {
@Required
public String name;
@OneToOne(fetch = FetchType.EAGER)
public Player player;
}
@Entity
public class Player extends Model {
@Required
public String nickname;
@Required
public Gender gender;
}
我将始终从Player
访问User
,我希望当我加载用户时,他的播放器也会加载(这就是我使用fetch = FetchType.EAGER
的原因)。
所以我希望(出于优化目的)当我加载User
时,查询是一个JOIN查询,它也会加载Player
。
类似的东西:
select u, p from User u join u.player p where u.player_id = p.id
但是当我查看查询计数和查询调试输出时,我可以看到执行了2个查询。 类似的东西:
select u from User u
select p from Player p where p.id = ?
但这未经过优化,如何让JPA执行加入请求以获取User
及其Player
?
坦克你的帮助!
编辑:我正在使用Play framework 1.2.5
答案 0 :(得分:2)
编辑:此答案仅适用于使用Ebean的Play 2.0。
目前尚不清楚您是使用Ebean还是普通JPA。
如果它是Ebean,如doc中所述,您必须获取链接的实体:
List<User> orders =
Ebean.find(User.class)
.fetch("player")
.findList();
答案 1 :(得分:2)
在User类中,您在评论中注意到播放器可以为null
public static void findByIdWithPlayer(Long id) {
find("select distinct user from User user left join fetch user.player where user.id=?", id).first();
}