这里是Spring靴。在实现复杂查询的上下文中使用jparepositories
和specification
时,我正试图理解这些内容,并努力在几个项目上看到“树丛中的森林”。
规范
的一个规范示例如下:
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
表示什么?最重要的是,听起来您需要为要应用的每种类型的筛选器创建一个specification
impl,因为每个specificimpl被翻译成一个且仅一个谓词...例如,如果我想查找所有姓氏为“smeeb”且年龄大于25岁的人,听起来我需要编写一个LastNameMatchingSpecification
以及一个AgeGreaterThanSpecification
。有人能为我证实或澄清这一点吗?!
root
和criteriaQuery
代表什么?
root
是查询的根,基本上是您要查询的。在specification
中,您可以使用它对此进行动态响应。例如,通过检测类型并使用适当的属性,这将允许您构建一个olderthanspecification
来处理具有modelyear
的car
和具有dateofborne
的drivers
。
类似的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)中调用这个方法,但我不知道如何调用。目