2016-03-08 55 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不客气。我更新我的答案。 –