2016-03-08 58 views
0

我必須使用Hibernate進行特定查詢。在休眠中嵌套createAlias()

下面的類只是一個簡單的例子,使您更容易理解我的場景和我的目標。我在寫這篇文章的時候編了個例子,希望我沒有犯錯(反正不注意錯誤:D)。

class Father{ 
    int id; 

    @OneToMany(mappedBy = "father", fetch = FetchType.LAZY) 
    List<Son> sonList; 
} 

class Son{ 
@ManyToOne(targetEntity=Father.class) 
@JoinColumn(referencedColumnName = "id", name = "father") 
Father father; 

@OneToMany(mappedBy = "son", fetch = FetchType.LAZY) 
List<Toy> toyList; 
} 

class Toy{ 
@ManyToOne(targetEntity=Son.class) 
@JoinColumn(referencedColumnName = "id", name = "son") 
Son son; 

@OneToMany(mappedBy = "Feature", fetch = FetchType.LAZY) 
List<Feature> featureList; 
} 

class Feature{ 
@ManyToOne(targetEntity=Toy.class) 
@JoinColumn(referencedColumnName = "id", name = "toy") 
Toy toy; 

boolean unisex; 
} 

我不得不從數據庫中Fatherid = 1選擇,與他的親戚Son,但只有個兒子,有一個Feature.unisex = trueToy

我不知道如何到達的字段Feature.unisex

隨着createAlias()我可以這樣做:

Criteria criteria = session.createCriteria(Father.class);   
criteria.createAlias("sonList", "sonListAlias"); 
criteria.add(Restrictions.idEq(1)); 
criteria.add(Restrictions.in("sonListAlias.toyList", toyList)); 

,但我不能走的更遠。我應該需要這樣的東西:

Criteria criteria = session.createCriteria(Father.class);   
criteria.createAlias("sonList", "sonListAlias"); 
criteria.add(Restrictions.in("sonListAlias.toyList.featureList.unisex", unisex)); 

但當然,這是不正確的做法。

預先感謝您。

回答

1

首先,請不要使用不必要的映射屬性。我的意思是targetEntity=Father.classreferencedColumnName = "id", name = "father"。並且不要使用像sonList這樣的名稱,只需要sons

Criteria criteria = session.createCriteria(Father.class);   
criteria.createAlias("sonList", "son"); 
criteria.createAlias("son.toyList", "toy"); 
criteria.createAlias("toy.featureList", "feature"); 
criteria.add(Restrictions.idEq(1)); 
criteria.add(Restrictions.eq("feature.unisex", true)); 

如果你需要預先抓取sonList,你可以嘗試使用setFetchMode("sonList", FetchMode.JOIN)

如果需要

「永遠」獲得了父親和只得到他的兒子有有玩具 Feature.unisex =真

,你可以嘗試使用@Filter

Hibernate @Filter and @FilterJoinTable Annotation Example

但我認爲它會更好,如果您加載sonList在一個單獨的請求

Criteria criteria = session.createCriteria(Son.class);   
    criteria.createAlias("father", "father"); 
    criteria.createAlias("toyList", "toy"); 
    criteria.createAlias("toy.featureList", "feature"); 
    criteria.add(Restrictions.eq("father.id", 1)); 
    criteria.add(Restrictions.eq("feature.unisex", true)); 
+0

謝謝你的男人,你一直很有幫助;你解決了我幾乎所有的問題。但是在我的帖子中,可能我還不夠清楚。根據你的問題,只有當父親有一個有玩具的兒子時,我才能得到父親,就像Feature.unisex = true。我真正需要的是「總是」找到一位父親,只讓他的兒子擁有Feature.unisex = true的玩具。 不知道如果我已經清楚:D – MDP

+1

@MDP不客氣。我更新我的答案。 –