我正在尝试使用从数据库中检索到的对象列表创建一个新的 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 许可协议
在详细了解 Spring Data 的工作原理后,我最终在 JpaRepository 实现中对我的方法使用了
@Query
注释来正确查询数据库并过滤结果,无需使用流然后转换回 Page .如果有人需要示例,上面的代码将如下所示:
我知道 Spring 的
findBy
方法,但有时根据参数的数量,方法名称变得非常难以阅读,所以我只是坚持使用 JPQL。通过这种方式,页面的内容将始终具有您在 Spring 配置中定义的最大数量的元素。
我还使用
PageImpl
的自定义实现,我现在不在工作,无法访问代码,但我会尽可能发布它。编辑:可以在 此处 找到自定义实现