首页 > 解决方案 > Stream.count() 如何处理 Spring 存储库查询?

问题描述

我在 Spring 框架中工作并使用存储库将数据作为流加载。下面是正在使用的代码:

@Query("select j from User j ")
@QueryHints({ @QueryHint(name = HINT_FETCH_SIZE, value = Constants.JPA_QUERYHINT_FETCH_SIZE) })
Stream<User> streamAll();

当我们调用service.getStream().count()方法时,它是在内存中加载完整的数据集还是有一些关于流大小的元信息?

这里我关心的是内存消耗和性能。

标签: javaspringjava-stream

解决方案


自己试试。

如果返回 true,则无需迭代即可获得计数。

如果它返回 false 那么你将不得不迭代。

myRepo.streamAll().spliterator().hasCharacteristics(Spliterator.SIZED)

检查实现有点繁琐,因为Spring 为 repos 创建了一个动态代理

我想没有什么可说的,即使现在没有这种优化,将来也可能无法使用。可能也取决于数据库供应商,因为并非所有人都有 O(1) 的方式来获取行数(通常通过将其存储为表元数据来完成)。


推荐阅读