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 的播放框架的关系的主要内容,如果未能解决你的问题,请参考以下文章