2017-02-01 4 views
3

表情報に返します一つだけのアイテムを取得:メディアエンティティが保持しているメディアコレクション

---------- 
id | mediaid | url 
======================== 
104 | 103  | IMG_PATH 
383 | 103  | IMG_PATH 
384 | 103  | IMG_PATH 
395 | 103  | img_path 

その親テーブルの外部キーMEDIAIDを含ま

画像テーブル画像のコレクション:

private Set<Image> images = new HashSet<Image>(0)`; 

@OneToMany(mappedBy = "media", targetEntity = Image.class ,cascade = CascadeType.ALL) 
public Set<Image> getImages() { 
    return images; 
} 

イメージ・エンティティスニペット:

private Media media; 
@ManyToOne 
@JoinColumn(name = "mediaId") 
public Media getMedia() { 
    return media; 
} 

は私がFK提供そのIDに一致するすべての画像のコレクションとメディアオブジェクトを返す必要があり、次のクエリを、実装しました。

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Media> cqObject = cb.createQuery(Media.class); 
Root<Media> rootEntry = cqObject.from(Media.class); 

rootEntry.fetch(Media_.images, JoinType.LEFT);    
Predicate predicate = cb.equal(rootEntry.get(Media_.id), id);   
cqObject.select(rootEntry).where(predicate);   
Media _fetcheMedia = em.createQuery(cqObject).getSingleResult(); 

返されるMediaオブジェクトのコレクションには、1つのイメージアイテムしか含まれません。データベースには、指定したメディアの複数のイメージアイテムが含まれていることがわかります。

*注Media_は、単にメディアエンティティ

は、それは私の一部の愚かな間違いだったのid = 103

select media0_.mediaId as mediaId1_8_0_, 
    images1_.imageId as imageId1_6_1_, 
    media0_.active as active2_8_0_, 
    media0_.created as created3_8_0_, 
    media0_.description as descript4_8_0_, 
    media0_.listType as listType5_8_0_, 
    media0_.parentId as parentId6_8_0_, 
    media0_.propertyTypeId as property7_8_0_, 
    media0_.seasonId as seasonId8_8_0_, 
    media0_.status as status9_8_0_, 
    media0_.userId as userId10_8_0_, 
    images1_.active as active2_6_1_, 
    images1_.created as created3_6_1_, 
    images1_.imageTypeId as imageTyp5_6_1_, 
    images1_.imageUrl as imageUrl4_6_1_, 
    images1_.mediaId as mediaId6_6_1_, 
    images1_.mediaId as mediaId6_6_0__, 
    images1_.imageId as imageId1_6_0__ from media media0_ 
    left outer join image images1_ on media0_.mediaId=images1_.mediaId where media0_.mediaId=103 
+0

いいえ、Mediaオブジェクトを取得したら、エンティティでロードされたイメージセットか、遅延初期化が必要なプロキシですか? –

+0

私はそれがデフォルトでは怠惰なinitであると仮定しています。そして、rootEntry.fetch(Media_.images、JoinType.LEFT)はコレクションにフェッチを強制します。 – Fabii

+0

基準は大丈夫です..デバッグモードで実行し、生成されたクエリを投稿できますか? –

答えて

0

でメディアオブジェクトのために休止状態を表すメタモデルクラスで、私は忘れてしまいましたImageエンティティのhashcodeメソッドとequalsメソッドをオーバーライドします。それらを追加し、必要な動作を知っています。

@Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = super.hashCode(); 
     result = prime * result + (int) (id^(id >>> 32)); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (!super.equals(obj)) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Image other = (Image) obj; 
     if (id != other.id) 
      return false; 
     return true; 
    } 
関連する問題