Hibernate中嵌套的createAlias()

时间:2016-03-08 10:31:27

标签: java hibernate criteria

我必须使用Hibernate进行特定查询。

以下课程只是一个简单的例子,让您更容易理解我的情景和目标。我在撰写这篇文章时编写了这个例子,我希望我没有犯错误(反正不注意错误: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,但只有ToyFeature.unisex = true的儿子

我不知道如何到达班级Feature.unisex的{​​{1}}字段。

Toy我可以这样做:

createAlias()

但我不能再往前走了。我需要这样的东西:

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

但是,当然,这不是正确的方法。

提前谢谢。

1 个答案:

答案 0 :(得分: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)

如果你需要

  

&#34;总是&#34;得到一个父亲,只得到他的儿子有玩具   Feature.unisex = true

您可以尝试使用@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));