弹簧数据页没有返回大小正确的页面?

我正在尝试使用从数据库中检索到的对象列表创建一个新的。首先,我从数据库获取所有元素,将其转换为流,然后使用 lambda 筛选结果。然后我需要一个具有一定数量元素的Page,但是,实例化一个新的似乎不会返回具有正确大小的页面。PagePageImpl

这是我的代码:

List<Produtos> listaFinal;
Stream<Produtos> stream = produtosRepository.findAll().stream();
listaFinal = stream.filter(p -> p.getProdNome().contains("uio")).collect(Collectors.toList());

long total = listaFinal.size();
Page<Produtos> imp = new PageImpl<>(listaFinal,pageable,total);

下面是调试的屏幕截图:

请注意,Pageable 对象中的大小设置为 20,并且它知道它需要 4 个页面才能呈现 70 个元素,但它返回整个列表。

我错过了什么?

编辑回答托马斯的评论:

我了解如何使用 Page 仅返回一部分数据。我显示的代码是我试图使用 lambda 表达式来筛选我的集合。对我来说,问题是我想使用Java 8的lambda通过Spring Data JPA查询数据库。我习惯了VB。NET和Entity查询表达式,并想知道如何使用Spring JPA做同样的事情。function(x)

在我的存储库中,Im using 它使我可以访问.但是,谓词没有键入,因此我不能简单地在查询中使用。我正在使用SQL Server和Hibernate。extends JpaRepository<Produtos, Integer>, QueryDslPredicateExecutor<Produtos>findAll(Predicate,Pageable)p -> p.getProdNome().contains("uio")


答案 1

为了扩展 stites 的答案PagedListHolder 是要走的路,以下是方法:

List<String> list = // ...

// Creation
PagedListHolder page = new PagedListHolder(list);
page.setPageSize(10); // number of items per page
page.setPage(0);      // set to first page

// Retrieval
page.getPageCount(); // number of pages 
page.getPageList();  // a List which represents the current page

如果需要排序,请使用另一个带有可变排序定义的 PagedListHolder 构造函数


答案 2

PageImpl不打算对列表执行任何类型的分页。从文档中可以看出,它只是“基本实现”,听起来几乎像你想要的,但它确实具有误导性。Page

使用PagedListHolder,这是一个简单的状态持有者,用于处理对象列表,将它们分成页面。


推荐