我在项目中使用Spring Data JPA。我有下一个Entity Bean" TABLE"。我已经创建了自己的存储库
TableRepository extends JpaRepository<Table, Long>, JpaSpecificationExecutor<TABLE>.
我也创建了规范来选择过滤数据。我有bean应该选择的项目,并将它们分组在一个 .in()谓词列表中(类似于&#34; SELECT * FROM WHERE ID in(...)AND (...)和VALUE2中的值(...)...... &#34;)
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>
感谢。