gpt4 book ai didi

java - Hibernate 中的嵌套 createAlias()

转载 作者:行者123 更新时间:2023-12-01 10:16:26 24 4
gpt4 key购买 nike

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

以下类(class)只是一个简单的示例,以便您更容易理解我的场景和我的目标。我在写这篇文章时编造了这个例子,我希望我没有犯错误(无论如何不要注意错误: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;
}

我必须从数据库中选择一个父亲,其id = 1,以及他的亲戚儿子,但仅限于具有带有 Feature.unisex = trueToy

我不知道如何访问Toy类的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));

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

提前谢谢您。

最佳答案

首先,请不要使用不必要的映射属性。我的意思是 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)

如果您需要

"always" get a father and get only his sons that have toys that have 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));

关于java - Hibernate 中的嵌套 createAlias(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35864941/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com