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

JPA规范示例

艾泽语
2023-03-14

这里是Spring靴。在实现复杂查询的上下文中使用jparepositoriesspecification时,我正试图理解这些内容,并努力在几个项目上看到“树丛中的森林”。

规范的一个规范示例如下:

public class PersonSpecification implements Specification<Person> {
    private Person filter;

    public PersonSpecification(Person filter) {
        super();
        this.filter = filter;
    }

    public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> cq,
            CriteriaBuilder cb) {
        Predicate p = cb.disjunction();

        if (filter.getName() != null) {
            p.getExpressions()
                    .add(cb.equal(root.get("name"), filter.getName()));
        }

        if (filter.getSurname() != null && filter.getAge() != null) {
            p.getExpressions().add(
                    cb.and(cb.equal(root.get("surname"), filter.getSurname()),
                            cb.equal(root.get("age"), filter.getAge())));
        }

        return p;
    }
}

在这个topRedicate(...)方法中,root CriteriaQuery表示什么?最重要的是,听起来您需要为要应用的每种类型的筛选器创建一个specificationimpl,因为每个specificimpl被翻译成一个且仅一个谓词...例如,如果我想查找所有姓氏为“smeeb”且年龄大于25岁的人,听起来我需要编写一个LastNameMatchingSpecification 以及一个AgeGreaterThanSpecification 。有人能为我证实或澄清这一点吗?!

共有1个答案

公良扬
2023-03-14

root criteriaQuery代表什么?

root是查询的根,基本上是您要查询的。在specification中,您可以使用它对此进行动态响应。例如,通过检测类型并使用适当的属性,这将允许您构建一个olderthanspecification来处理具有modelyearcar和具有dateofbornedrivers

类似的criteriaquery是一个完整的查询,您可以再次使用它来检查它,并根据它调整您构造的谓词。

如果我想查找所有姓氏为“Smeeb”且年龄大于25岁的人,听起来我需要编写一个LastNameMatchingSpecification 以及一个AgeGreaterThanSpecification 。有人能为我证实或澄清这一点吗?!

我想你错了。接受规范的Spring数据接口只接受单个规范。因此,如果您想要找到具有特定姓名和特定年龄的所有Person,您将创建一个Specification。与您引用的示例类似,它也结合了两个约束。

但是您可以创建单独的specification,然后创建另一个组合的specification,如果您希望单独使用每一个,但也可以组合使用。

 类似资料:
  • 为什么它更高效,因为像'your_name'这样的c.name扫描只在第一个查询中发生一次。

  • 我的JPA实体作为枚举字段 哪里 如果我用规范添加where条件 将枚举包含到规范查询中的正确方法是什么?

  • 有一个使用属性表达式的查询:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-方法。查询属性表达式: 试图通过规范执行查询: 我得到了一个错误: 我做错了什么或忘记添加了什么? 查询:按教师姓名显示所有学生 基地实体: 实体教师: 实体学生: 实体教室: 实体教室:

  • 现在挣扎着与first存在,因为它已经加入了。有没有办法用规范来做到这一点。也因为有两个存在,这是否意味着我需要两个规范。我能在一个规范中实现它吗。

  • 我对Spring Data JPA是新手,有两个实体,很少使用stackoverflow的例子,但运气不好。 用户-->*纳税 纳税人。JVA 公共类纳税实现可序列化{ }

  • 我按照本教程获得了Spring Data JPA规范:https://dzone.com/articles/using-spring-data-jpa-specification 它为我实现了这一点,但我不能调用规范方法来搜索它们。我想把它们放在我的SearchController中: 现在我想在我的SearchController(比如Controller)中调用这个方法,但我不知道如何调用。目