Spring Boot在这里。我想换我的头周围JpaRepositories,并Specifications在执行复杂查询的上下文中使用,当我在努力“通过舍本逐末”的几个项目看。
JpaRepositories
Specifications
a的一个典型示例Specification如下:
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<Person>和CriteriaQuery代表什么?最重要的是, 听起来 您需要为要应用的 每种 过滤器类型创建一个Specificationimpl ,因为每个规范都转换为一个且只有一个谓词…因此,例如,如果我想查找所有姓为“ Smeeb”的年龄大于25岁,听起来我需要写以及。有人可以帮我确认或澄清吗? __LastnameMatchingSpecification<Person>``AgeGreaterThanSpecification<Person>
toPredicate(...)
Root<Person>
CriteriaQuery
LastnameMatchingSpecification<Person>``AgeGreaterThanSpecification<Person>
什么做Root<Person>和CriteriaQuery代表什么?
Root是查询的根,基本上 就是 您要查询的内容。在中Specification,您可以使用它来对此动态地做出反应。例如,这将允许您通过检测类型并使用适当的属性来构建一个用a 和a OlderThanSpecification处理Car的。modelYear``Drivers``dateOfBirth
Root
OlderThanSpecification
Car
modelYear``Drivers``dateOfBirth
Similiar CriteriaQuery是一个完整的查询,您可以再次使用它来检查它并根据它修改您正在构造的谓词。
如果我想查找所有姓氏为“ Smeeb”且年龄大于25岁的人,听起来我需要写一个LastnameMatchingSpecification<Person>和AgeGreaterThanSpecification<Person>。有人可以帮我确认或澄清吗?
LastnameMatchingSpecification<Person>
AgeGreaterThanSpecification<Person>
我想你错了。接受Specification的Spring Data接口仅接受一个Specification。因此,如果要查找Person具有特定名称和特定年龄的所有s,则可以创建一个Specification。与您引用的示例类似,该示例也结合了两个约束。
Person
但是,您可以创建单独Specification的,然后创建另一个组合,如果您想分别使用,也可以组合使用。