【问题标题】:ew@OneToOne relationship with play framework that does not use JOINew@OneToOne 与不使用 JOIN 的播放框架的关系
【发布时间】:2012-10-19 15:26:04
【问题描述】:

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

我将始终从User 访问Player,并且我希望在加载用户时也加载他的播放器(这就是我使用fetch = FetchType.EAGER 的原因)。

所以我希望(出于优化目的)当我加载User 时,查询是一个同时加载Player 的JOIN 查询。 类似的东西:

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

【问题讨论】:

    标签: java jpa playframework playframework-1.x


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答,但它不起作用:(。当我从查询中删除“join fetch user.player”时,它可以工作(除了它不加载播放器),但带有“ join fetch user.player" 语句不起作用:(
    • 不知道在这种情况下您的问题是什么,但这是在 hql (docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/…) 中定义 fetch 的正确语法。您不必在模型类中定义渴望获取。
    • 感谢您的帮助,我设法通过将请求更改为:from User user left join fetch user.player where user.id = ?跨度>
    • 我刚刚阅读了有关 SQL 中连接的更多信息,我想通了为什么它不适用于“连接提取”,这是因为当我第一次注册和登录时,Player 是尚未创建,因此与不存在的玩家进行内部连接不起作用。这就是“左连接获取”起作用的原因,因为即使还没有与之关联的玩家,它也会加载用户
    【解决方案2】:

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

    不清楚您使用的是 Ebean 还是纯 JPA。

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

    List<User> orders =   
        Ebean.find(User.class)  
            .fetch("player")  
            .findList();  
    

    【讨论】:

    • 我认为这是普通的 JPA,但我不确定,这是由应该使用 JPA 的 Play Framework 处理的
    • 从文档playframework.org/documentation/2.0.4/JavaEbean 看来,您使用的是 Ebean,因为您的实体正在扩展 Model 类。所以上面提供的代码应该可以按预期工作。
    • 我用的是play framework 1.2.5版,也是Ebean吗?我什么都看不到
    • 不,抱歉,我以为您使用的是 Play 2.0。 Play 1.2.5 不使用 Ebean,所以我的回答不适用于您的情况。由于您使用的是 1.2.5,因此您使用的是 JPA。
    • 对不起,我忘了指定我的版本。你对 JPA 有什么想法吗?为什么不在查询中使用 JOIN 来优化它们?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    相关资源
    最近更新 更多