ew @ OneToOne与不使用JOIN的播放框架的关系

时间:2012-10-19 15:26:04

标签: java jpa playframework playframework-1.x

我有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

2 个答案:

答案 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();
}