4

我在项目中使用 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()带有TableRepositoryPageable参数的项目。

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>

谢谢。

4

0 回答 0