当前位置: 首页 > 知识库问答 >
问题:

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

马业
2023-03-14

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

@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;

}    

现在我想找到某个城市的家长,比如说“BigCity”,孩子们在学校“AwesomeSchool”,他们在六年级一班。我只想通过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));

不幸的是,这里有两个问题:-看起来我无法在列表属性上调用获取(“学校”)-这将返回所有孩子在“AwesomeSchool”或在学校6年的家长。

你能帮帮我吗?我想过使用连接,但有同样的问题:我如何定义连接的在哪里部分,以便它认为必须同时满足两个属性(School和ynInSchool)。我发现了类似的关于查询其子级满足一个条件的对象的帖子——但在这里,子级必须同时满足两个条件。

更新1 如果我使用联接来断言例如一个孩子的“学校”,那么到目前为止,我对谓词的看法是:

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

我怎样才能重用这个连接的对象来断言is也用于第二个过滤条件呢?

共有1个答案

牟嘉
2023-03-14

您需要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
 类似资料:
  • 问题内容: 我是AngularJS的新手。我了解到可以使用以下查询在DOM中找到元素: 这对于按ID或CSS类名查找元素很有用。但是,我需要能够使用其他方法来查找元素。我有一个看起来像下面的元素: 我无法查询“ myContainer”,因为它已被重用了多少。因此,我想找到任何具有“ my- directive”属性的元素。如何搜索DOM并找到任何使用“我的指令”的元素? 问题答案: 您应该在指令

  • 我试图找到一个没有属性的元素的XPath。它只能通过其父级的属性来识别。然而,父级也不具有唯一属性。 例如: 这里有两个元素。如何获得第二个元素。上面的语法为我提供了第一个元素。。但是,如果我使用: 我得到一个错误消息"xpath表达式 '//*[@id="btn"][2]/ul/li[2]/a/span'无法计算或不会导致WebElement"

  • 问题内容: 我有一些复杂的对象,例如猫,它具有许多属性,例如年龄,喜爱的猫食等等。 Java集中存储了一堆猫,我需要查找所有3岁的猫,或者最喜欢猫粮的Whiskas。当然,我可以编写一个自定义方法来查找那些具有特定属性的Cat,但是这样做会麻烦许多属性。有一些通用的方法吗? 问题答案: 您可以编写一个采用接口实例的方法,该实例定义了一个方法,该方法可以通过所需的任何属性检查来实现。 更好的是,使其

  • 问题内容: 如何使用BeautifulSoup搜索仅包含我要搜索的属性的标签? 例如,我要查找所有标签。 如下代码: 获取我想要的所有数据,还获取具有该属性的所有标签 我也试过了: 这什么也不返回(可能是由于正则表达式不好) 我想知道在BeautifulSoup中是否有一种方法可以说“查找唯一属性为”的标签 *例如,如果HTML文档包含以下标记,则为 *UPDATE : 我只希望第一个标签()返回

  • 如果集合包含具有特定属性值的元素,我想断言(使用JUnit,而不是任何其他依赖项,如hamcrest)。 我发现这个问题如何断言迭代包含具有特定属性的元素?使用危害冠。 一种选择是重写< code>equals方法,只检查我想要比较的属性,但这不是一个好的解决方案。 有没有一种优雅的方法可以使用JUnit 4来实现这一点,或者我应该对其进行编码并循环访问集合以检查值?

  • 问题内容: 我想找到在其标签集中包含 所有 给定标签的项目。 以下是简化的类: 如果我这样尝试 我得到包含 任何 给定标签的项目。这不足为奇,但我希望包含 所有 给定标签的项目。所以我尝试另一种方式: 我收到错误消息。如果仅包含一个标签,它将起作用,但失败的原因不止于此。 如何在JPQL中表达呢? 问题答案: 诀窍是使用计数: