有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JAVAew@OneToOne与不使用联接的播放框架的关系

我有两个有@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;
}

我将始终从User访问Player,我希望当我加载一个用户时,他的播放器也被加载(这就是为什么我使用fetch = FetchType.EAGER

因此,我希望(出于优化目的)当我加载User时,查询是一个连接查询,它也会加载Player。 比如:

select u, p from User u join u.player p where u.player_id = p.id

但是当我查看查询计数和查询调试输出时,我可以看到执行了两个查询。 比如:

select u from User u
select p from Player p where p.id = ?

但这并没有得到优化,如何让JPA执行连接请求来获取我的User及其Player

谢谢你的帮助

编辑:我正在使用Play framework 1.2.5


共 (2) 个答案

  1. # 1 楼答案

    编辑:此答案仅适用于带有Ebean的Play 2.0

    不清楚您使用的是Ebean还是普通JPA

    如果它是Ebean,如doc中所述,则必须获取链接的实体:

    List<User> orders =   
        Ebean.find(User.class)  
            .fetch("player")  
            .findList();  
    
  2. # 2 楼答案

    在User类中,正如您在注释中注意到的,player可以为null

    public static void findByIdWithPlayer(Long id) {
        find("select distinct user from User user left join fetch user.player where user.id=?", id).first();
    }