- PR -

JPQLで複数のfetch join

1
投稿者投稿内容
mikan
会議室デビュー日: 2007/07/29
投稿数: 2
投稿日時: 2007-07-29 16:11
こんにちは。

Java Persistence APIについてです。
次のように複数の関連を持ったエンティティがあります。
コード:
@Entity
public class User implements Serializable {

    @OneToMany(mappedBy="user")
    private List<Book> books;

    @OneToMany(mappedBy="user")
    private List<Image> images;

    ・・・・・・

}



このエンティティの一覧を一度のSQLで関連するBookも一緒にロードしたい場合、
次のように書くことで実現できることはわかりました。
コード:
List<User> users =  entityManager
    .createQuery("select distinct u from User u left join fetch u.books")
    .getResultList();



これをBookだけでなくImageの関連(images)も一緒にロードするように変更する場合、どのようにJPQLを書けばよろしいのでしょうか?

JPAはHibernate実装を使用しています。
よろしくお願いします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-07-29 21:58
引用:

mikanさんの書き込み (2007-07-29 16:11) より:
コード:
List<User> users =  entityManager
    .createQuery("select distinct u from User u left join fetch u.books")
    .getResultList();




select distinct u from User u left join fetch u.books left join fetch u.images
でいいんじゃないですか?試してないんで微妙ですけど。
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-07-29 22:50
引用:

select distinct u from User u left join fetch u.books


項目 u テーブル別名 u とすると後々で解らなくなりますよ。

User 1 : Book n
User 1 : Image n

という関係性だと思いますが。

select distinct u
from ( select distinct u from User left join fetch User.images )
left join fetch User.books


が二重結合の方法だったとおもった
mikan
会議室デビュー日: 2007/07/29
投稿数: 2
投稿日時: 2007-07-29 23:52
こんばんは。

To 杏さん
引用:

select distinct u from User u left join fetch u.books


上記JPQL(Java Persistence Query Language)の"u"は"identification variable(識別変数?)"と呼ばれるもので、SQLのエイリアス(別名)とは異なるものです。
JPQLの中で項目(というよりもプロパティ or フィールド)uを参照する必要がある場合、次のように(識別変数).uのように指定する必要があります。
コード:
select u from User u where u.u like '%a%'
最初と2番目のuは識別変数。
3番目のu.uは識別変数uのuというプロパティを参照。


下記については理解できませんでした。
引用:

項目 u テーブル別名 u とすると後々で解らなくなりますよ。



コード:
select distinct u
from ( select distinct u from User left join fetch User.images )
left join fetch User.books 


現在のJPQL(JPA2.0ではできるようになる?)ではfrom句に副問い合わせを利用できないため、これは実行できないと思います。
たぶんSQLと混乱されているような?

To あしゅさん
ご指摘のクエリーで実行できました。
質問する前に試したのですが、その時は検索条件の指定ミスで動かなかったようです(汗。

お二方、返信ありがとうございました。

朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-07-30 07:41
[quote]
mikanさんの書き込み (2007-07-29 23:52) より:
こんばんは。

To 杏さん
引用:

select distinct u from User u left join fetch u.books


上記JPQL(Java Persistence Query Language)の"u"は"identification variable(識別変数?)"と呼ばれるもので、SQLのエイリアス(別名)とは異なるものです。
JPQLの中で項目(というよりもプロパティ or フィールド)uを参照する必要がある場合、次のように(識別変数).uのように指定する必要があります。
コード:
select u from User u where u.u like '%a%'
最初と2番目のuは識別変数。
3番目のu.uは識別変数uのuというプロパティを参照。


下記については理解できませんでした。
引用:

項目 u テーブル別名 u とすると後々で解らなくなりますよ。



テーブル名と項目名を同じにするといまいちDB系が解ってない別の人が見たときに
バグの温床になる恐れがあるということですよ。
短く、画面で見える程度のものしかない場合なら同じでもいいのですけどね。

あと DBに投げるときにSQL変換しているのでSQLも直接可能ということで出したまで。

1

スキルアップ/キャリアアップ(JOB@IT)