2011-02-03 97 views
1

Hy全部, 我有三個表兒童,寵物和玩具。寵物有一個參考鑰匙兒童id,並且玩具有一個參考鑰匙到狗id。 我想加載關於孩子和他的寵物的所有數據,但我不希望加載玩具數據懶惰加載不起作用 - jpa

@OneToMany(mappedBy = "petEntity", fetch = FetchType.LAZY) 
public Set<PetEntity> getPetEntitySet() { 
    return petEntitySet; 
} 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "ChildId", insertable = false, updatable = false) 
public ChildEntity getChildEntity() { 
    return childEntity; 
} 

相同的一套玩具。

加載數據我有

List<ChildEntity> list = entityManager.createQuery(
"SELECT c FROM ChildEntity c "+ 
"LEFT JOIN FETCH c.petEntitySet ", 
ChildEntity.class).getResultList(); 
    return list; 

但是這件事情我加載的所有數據,不只是孩子和他的寵物的信息。

我怎樣才能抑制實體管理表中只加載數據,而不是使加入的時候我不想說

感謝您的建議

我忘了提及的是,這個追逐它不僅加載所有數據,但它返回的不僅僅是一個子元素的一個副本

+0

爲什麼你認爲它加載的所有數據? – axtavt 2011-02-03 10:14:33

回答

2

加載更多數據的原因是因爲您正在使用關鍵字fetch。這會將EAGERLY加載任何孩子的寵物。 只要刪除fetch並會發生延遲加載。

更新

我看,這其實你想要的是,這樣只是確保equals()hashCode()在所有相關的類被正確重寫,因爲我假設你正在使用Set
這樣,JPA知道如何查找重複的

二更新

是的,你可以很容易地使用DISTINCT在查詢中。

就在添加DISTINCT您選擇

List<ChildEntity> list = entityManager.createQuery(
"SELECT DISTINCT c FROM ChildEntity c "+ 
"LEFT JOIN FETCH c.petEntitySet ", 
ChildEntity.class).getResultList(); 
    return list; 
+0

我解決了這個問題,我現在有另一個問題,如果一個孩子在結果列表中有超過1個寵物,例如3個,我會有3個孩子,每個孩子都有一個寵物,而不是樹木害蟲(我是usisng集合) ,它有什麼辦法,我可以使用像標準不同的根目錄? – 2011-02-03 12:59:54