JpaSpecificationExecutor JOIN + ORDER BY in Specification
2022-09-03 00:52:55
我有一个使用 JOIN 和 ORDER BY 的查询,并希望使用条件 API 在我的存储库中使用它。
在这里,我发现,如何将这样的查询包装到一个 CriteriaQuery (Link) 中。
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
Join<Pet, Owner> owner = cq.join(Pet_.owners);
cq.select(pet);
cq.orderBy(cb.asc(owner.get(Owner_.lastName),owner.get(Owner_.firstName)));
另一方面,我发现了一些示例,将 Criteria Api 与 JpaRepository 结合使用(示例)。
问题是存储库中的所有方法都期望规范:
T findOne(Specification<T> spec);
它总是这样构建的:
public static Specification<PerfTest> statusSetEqual(final Status... statuses) {
return new Specification<PerfTest>() {
@Override
public Predicate toPredicate(Root<PerfTest> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
return cb.not(root.get("status").in((Object[]) statuses));
}
};
}
因此,一方面,我知道如何创建CriteriaQuery,另一方面,我需要一个从谓词构建的规范,我无法弄清楚如何将CriteriaQuery解析为规范/谓词。