Spring Data PageImpl 没有返回正确大小的页面?

新手上路,请多包涵

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

这是我的代码:

 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 和实体 function(x) 查询表达式,并且想知道如何使用 Spring JPA 执行相同的操作。

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

原文由 dubonzi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 921
2 个回答

在详细了解 Spring Data 的工作原理后,我最终在 JpaRepository 实现中对我的方法使用了 @Query 注释来正确查询数据库并过滤结果,无需使用流然后转换回 Page .

如果有人需要示例,上面的代码将如下所示:

 @Query("select p from Produtos p where p.prodNome = ?1")
public Page<Produtos> productsListByName(String prodNome, Pageable pageable)

我知道 Spring 的 findBy 方法,但有时根据参数的数量,方法名称变得非常难以阅读,所以我只是坚持使用 JPQL。

通过这种方式,页面的内容将始终具有您在 Spring 配置中定义的最大数量的元素。

我还使用 PageImpl 的自定义实现,我现在不在工作,无法访问代码,但我会尽可能发布它。

编辑:可以在 此处 找到自定义实现

原文由 dubonzi 发布,翻译遵循 CC BY-SA 3.0 许可协议

要扩展 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

如果您需要排序,请使用另一个带有 MutableSortDefinitionPagedListHolder 构造 函数。

原文由 Willi Mentzel 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题