Chr*_*ian 2 collections entity-framework jpa predicates
我有一个包含元素列表的实体,现在我想搜索这些元素的属性。这个约束应该是“和”连接的。请看这些简单的例子:
@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;
}
Run Code Online (Sandbox Code Playgroud)
现在我想找到某个城市的父母,让我们说“BigCity”,学校“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));
Run Code Online (Sandbox Code Playgroud)
不幸的是,这里有两个问题: - 看起来我无法调用get("school")list 属性 - 这将返回所有有孩子的父母,这些孩子要么在“AwesomeSchool”,要么在学校上学 6 年。
你能帮我吗?我考虑过使用连接,但同样的问题是:如何定义连接的where部分,以便它认为必须同时满足两个属性(school 和 yearInSchool)。我发现了类似的帖子,关于查询其孩子满足一个条件的对象 - 但在这里孩子必须同时满足两个条件。
更新 1 如果我使用连接来断言例如一个孩子的“学校”,那么我对谓词的了解就到此为止:
Predicate predicate = r.join("childrens").get("school").in(School.AwesomeSchool)
Run Code Online (Sandbox Code Playgroud)
我如何重用这个连接的对象来断言也适用于第二个过滤条件?
在形成子句时,您需要JOIN然后使用JOIN在形成连接时获得的对象WHERE。
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));
Run Code Online (Sandbox Code Playgroud)
也许你的意思是你的 JPQL 是:
SELECT p FROM Parent p JOIN p.childrens c
WHERE p.city = :theCity AND c.school = :theSchool AND c.yearInSchool = 6
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6254 次 |
| 最近记录: |