gpt4 book ai didi

entity-framework - JPA CriteriaBuilder 查找在集合中具有具有某些属性的元素的实体

转载 作者:行者123 更新时间:2023-12-05 02:21:01 24 4
gpt4 key购买 nike

我有一个包含元素列表的实体,现在我想搜索这些元素的属性。这个约束应该是“和”连接的。请看这些简单的例子:

@Entity
public class Parent {

@Column
@Enumerated(EnumType.STRING)
private City city;

@OneToMany(...)
private List<Children> childrens;
}

@Entity
public class Children {

@Column
@Enumerated(EnumType.STRING)
private School school;

@Column
private Integer yearInSchool;

}

现在我想在某个城市找到 parent ,让我们说“BigCity”, children 在学校“AwesomeSchool”上课/年级 6。我只想通过 CriteriaBuilder 获得搜索结果。

到目前为止我得到了:

final CriteriaBuilder c = getCriteriaBuilder();
final CriteriaQuery<Parent> query = c.createQuery(Parent.class);
final Root<Parent> r = query.from(Parent.class);
query.select(r)
.where(c.and(c.equal(r.get("city"), City.BigCity)),
c.equal(r.get("childrens").get("school"), School.AwesomeSchool),
c.equal(r.get("childrens").get("yearInSchool"), 6));

不幸的是这里有两个问题:- 看起来我无法在列表属性上调用 get("school")- 这将返回所有有 child 的 parent ,这些 child 要么在“AwesomeSchool”,要么在学校 6 年。

你能帮帮我吗?我考虑过使用连接,但同样的问题是:如何定义连接的 where 部分,以便它认为必须同时满足两个属性(学校和 yearInSchool)时间。我找到了关于查询其子项满足一个条件的对象的类似帖子 - 但这里的子项必须同时满足两个条件。

更新 1如果我使用连接来断言例如一个 child 的“学校”,到目前为止,我对谓词的理解是:

Predicate predicate = r.join("childrens").get("school").in(School.AwesomeSchool)

我如何重用这个连接对象来断言也适用于第二个过滤条件?

最佳答案

您需要JOIN,然后在形成WHERE 子句时使用您在形成连接时获得的JOIN 对象。

Join childrenJoin = r.join("childrens");

query.where(c.and(c.equal(r.get("city"), City.BigCity)),
c.equal(childrenJoin.get("school"), School.AwesomeSchool),
c.equal(childrenJoin.get("yearInSchool"), 6));

也许您的意思是您的 JPQL 是:

SELECT p FROM Parent p JOIN p.childrens c 
WHERE p.city = :theCity AND c.school = :theSchool AND c.yearInSchool = 6

关于entity-framework - JPA CriteriaBuilder 查找在集合中具有具有某些属性的元素的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36721759/

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