我在项目中使用 Spring Data JPA。我有下一个实体 Bean“TABLE”。我创建了自己的存储库
TableRepository extends JpaRepository<Table, Long>, JpaSpecificationExecutor<TABLE>.
我还创建了规范来选择过滤的数据。我有 bean 与应选择的项目并将它们分组在一个.in()谓词列表中(类似于“ SELECT * FROM WHERE ID in(...) AND VALUE in(...) AND VALUE2 in(.. .) ... ")
public static Specification<Table> filteredListOfValues(final FilterRequestsParametersBean filterRequestsParametersBean) {
return new Specification<Table>() {
public Predicate toPredicate(Root<Table> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
List<Predicate> listOfPredicates = createListOfPredicates(root, filterRequestsParametersBean);
return criteriaBuilder.and(listOfPredicates.toArray(new Predicate[listOfPredicates.size()]));
}
};
}
之后,我findAll()带有TableRepository和Pageable参数的项目。
this.getTableRepository().findAll(where(filteredListOfValues(filterRequestsParametersBean)), pageable);
表格视图:
id, value, etc..
1, 1, ...
2, 1, ...
3, 2, ...
4, 2, ...
5, 3, ...
6, 5, ...
和问题。如何使用 Pageable 选择与 TABLE 中的字段VALUE不同的所有值。
当然我可以使用 HashMap,但我不会使用 Spring Data JPA 的 Pageable 功能。我需要排序和分页。
我还可以对一个字段值使用规范,例如:
public static Specification<Long> filteredListOfValues(final FilterRequestsParametersBean filterRequestsParametersBean) {
return new Specification<Long>() {
public Predicate toPredicate(Root<Long> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
....//somethind like that
criteriaQuery.select(root.<Long> get("value")).distinct(true);
....
List<Predicate> listOfPredicates = createListOfPredicates(root, filterRequestsParametersBean);
return criteriaBuilder.and(listOfPredicates.toArray(new Predicate[listOfPredicates.size()]));
}
};
}
但在这种情况下,来自存储库 TableRepository 的方法 findAll() 只能接受如下规范:JpaSpecificationExecutor<Table>
,而不是JpaSpecificationExecutor<Long>
谢谢。