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

Posted

技术标签:

【中文标题】ew@OneToOne 与不使用 JOIN 的播放框架的关系【英文标题】:ew@OneToOne relationship with play framework that does not use 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

【问题讨论】:

【参考方案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 来优化它们?

以上是关于ew@OneToOne 与不使用 JOIN 的播放框架的关系的主要内容,如果未能解决你的问题,请参考以下文章

随机播放声音

播放随机声音

解决Python使用playsound播放音频报错:在用引号括起的字符串不能指定额外的字符

2021-08-17 用node调用本地播放器播放音乐

MySQL之SQL优化详解

数据库联表统计查询 Group by & INNER JOIN