JpaSpecificationExecutor JOIN + ORDER BY 规范
JpaSpecificationExecutor JOIN + ORDER BY in Specification
我有一个使用 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)));
另一方面,我找到了一些将条件 Api 与 JpaRepository (example) 结合使用的示例。
问题是存储库中的所有方法都需要规范:
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 解析为 Specification/Predicate.
尝试这样的事情(我假设宠物有很多主人):
public static Specification<Pet> ownerNameEqual(String ownerName) {
return new Specification<Pet>() {
@Override
public Predicate toPredicate(Root<Pet> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
Join<Pet, Owner> owners = root.join("owners");
criteriaQuery.orderBy(criteriaBuilder.desc(root.get("id")));
return criteriaBuilder.equal(owners.get("name"), ownerName);
}
};
}
这只是一个示例,用于搜索至少一位主人的名字等于 ownerName
的所有宠物
但是您可以在您的存储库中添加一个方法 List<Pet> findByOwnersNameOrderByIdDesc(String ownerName);
(相当于规范)。
我有一个使用 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)));
另一方面,我找到了一些将条件 Api 与 JpaRepository (example) 结合使用的示例。
问题是存储库中的所有方法都需要规范:
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 解析为 Specification/Predicate.
尝试这样的事情(我假设宠物有很多主人):
public static Specification<Pet> ownerNameEqual(String ownerName) {
return new Specification<Pet>() {
@Override
public Predicate toPredicate(Root<Pet> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
Join<Pet, Owner> owners = root.join("owners");
criteriaQuery.orderBy(criteriaBuilder.desc(root.get("id")));
return criteriaBuilder.equal(owners.get("name"), ownerName);
}
};
}
这只是一个示例,用于搜索至少一位主人的名字等于 ownerName
的所有宠物但是您可以在您的存储库中添加一个方法 List<Pet> findByOwnersNameOrderByIdDesc(String ownerName);
(相当于规范)。