jpa 标准、 predicate 和规范之间的区别是什么?

vm0i2vca  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(145)

在Spring Data JPA -参考文档中,条件定义如下:
编写条件实际上是定义域类查询的where子句。
规范和 predicate 似乎有着相同的作用。
criteriapredicatespecification之间有何区别?

omhiaaxx

omhiaaxx1#

标准

JPA 2.0中添加了CriteriaAPI。根据Java Persistence wikibook
Java持久性标准API用于通过构造基于对象的查询定义对象来定义动态查询,而不是使用JPQL的基于字符串的方法。
CriteriaBuilder用于构建CriteriaQuery对象,然后使用该对象执行查询,如本例中的Java Persistence wikibook

// Query for a List of objects.
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery();
Root employee = criteriaQuery.from(Employee.class);
criteriaQuery.where(criteriaBuilder.greaterThan(employee.get("salary"), 100000));
Query query = entityManager.createQuery(criteriaQuery);
List<Employee> result = query.getResultList();

同品种器械

Predicate类是Criteria API的一部分,用于构造where子句。例如,在Java EE 7 documentation

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
Predicate predicate1 = cb.equal(pet.get(Pet_.name), "Fido");
Predicate predicate2 = cb.equal(pet.get(Pet_.color), "brown");
cq.where(predicate1.and(predicate2));

规格

Specification接口由Spring Data JPA project定义。
为了能够定义可重复使用的 predicate ,我们引入了规范接口,该接口衍生自Eric Evans的Domain Driven Desig book中引入的概念。规范可以定义如下:

public static Specification<Customer> customerHasBirthday() {
    return new Specification<Customer> {
      public Predicate toPredicate(Root<T> root, CriteriaQuery query, CriteriaBuilder cb) {
        return cb.equal(root.get(Customer_.birthday), today);
      }
    };
  }

然后在JpaSpecificationExecutor中使用。

List<Customer> customers = customerRepository.findAll(customerHasBirthday());
h9a6wy2h

h9a6wy2h2#

不是来自API文档,而是我所看到的:
Criteria是一个抽象的概念,类似于Predicates的集合。CriteriaQuery将所有的Criteria设置为Predicate
因为CriteriaCriterion的复数,所以可以说Predicate等于Criterion
Spring Specification的实现旨在提供在构建CriteriaQueries时使用specification pattern的方法。
请随时纠正我的错误-最好是API文档。

相关问题