0

@OneToOne 関係を持つ 2 つのモデルがあります。UserモデルとモデルとしましょうPlayer。各ユーザーはプレーヤーであり、各プレーヤーはユーザーです。

これら 2 つのモデルのコードは次のとおりです。

@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;
}

私は常に aPlayerから aUserにアクセスし、User をロードするときに彼の Player もロードされるようにしたい (それが を使用した理由ですfetch = FetchType.EAGER)。

したがって、(最適化の目的で) をロードするUserと、クエリは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フレームワーク1.2.5を使用しています

4

2 に答える 2

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();
}
于 2012-10-22T05:35:07.983 に答える
2

編集:この回答は Play 2.0 with Ebean にのみ適用されます。

Ebean を使用しているかプレーン JPA を使用しているかは明確ではありません。

ドキュメントで説明されているように、Ebean の場合は、リンクされたエンティティをフェッチする必要があります。

List<User> orders =   
    Ebean.find(User.class)  
        .fetch("player")  
        .findList();  
于 2012-10-20T12:31:31.250 に答える