Java Stream.count()如何用于Spring存储库查询?

Java Stream.count()如何用于Spring存储库查询?,java,spring,java-stream,Java,Spring,Java Stream,我在Spring框架中工作,使用存储库将数据作为流加载。 下面是正在使用的代码: @Query("select j from User j ") @QueryHints({ @QueryHint(name = HINT_FETCH_SIZE, value = Constants.JPA_QUERYHINT_FETCH_SIZE) }) Stream<User> streamAll(); @Query(“从用户j中选择j”) @QueryHints({@QueryHint(name=

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

@Query("select j from User j ")
@QueryHints({ @QueryHint(name = HINT_FETCH_SIZE, value = Constants.JPA_QUERYHINT_FETCH_SIZE) })
Stream<User> streamAll();
@Query(“从用户j中选择j”)
@QueryHints({@QueryHint(name=HINT\u FETCH\u SIZE,value=Constants.JPA\u QueryHint\u FETCH\u SIZE)})
streamAll();
当我们调用
service.getStream().count()
方法时,它是在内存中加载完整的数据集,还是有一些关于流大小的元信息

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

自己试试

如果返回true,则可以在不迭代的情况下获取计数

如果返回false,则必须迭代

myRepo.streamAll().spliterator().hasCharacteristics(Spliterator.SIZED)
检查实现有点麻烦,因为

我想没有什么可以说的,即使这种优化现在没有到位,它可能在未来不可用。可能也取决于数据库供应商,因为并非所有数据库都有O(1)方式来获取行计数(通常通过将行计数存储为表元数据来实现)。

请自己尝试

如果返回true,则可以在不迭代的情况下获取计数

如果返回false,则必须迭代

myRepo.streamAll().spliterator().hasCharacteristics(Spliterator.SIZED)
检查实现有点麻烦,因为

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

流是惰性的 这意味着在调用终端操作之前不会获取结果

但是,
count()
是一个终端操作,因此执行管道

流也会短路 这意味着,如果遍历足够多的元素以使操作成功,则不会再遍历更多的元素。例如,
findFirst()
就是这样

但是,
count()
操作建议对所有元素进行计数,需要遍历所有元素才能得到结果

现在,好消息是可以直接从流源查询一些信息。一个这样的例子是当在流上设置标志
size
时元素的数量。然后,流足够智能,可以直接从流源获取信息,而不是遍历所有元素。这一优化错误地没有在Java8中实现,并且已经实现

流提供者 特征由流的提供者设置。而
count()
是否短路最终取决于流提供者。

流是惰性的 这意味着在调用终端操作之前不会获取结果

但是,
count()
是一个终端操作,因此执行管道

流也会短路 这意味着,如果遍历足够多的元素以使操作成功,则不会再遍历更多的元素。例如,
findFirst()
就是这样

但是,
count()
操作建议对所有元素进行计数,需要遍历所有元素才能得到结果

现在,好消息是可以直接从流源查询一些信息。一个这样的例子是当在流上设置标志
size
时元素的数量。然后,流足够智能,可以直接从流源获取信息,而不是遍历所有元素。这一优化错误地没有在Java8中实现,并且已经实现

流提供者
特征由流的提供者设置。而
count()。请随意编辑这个答案和结果,或者发布你自己的答案(在这种情况下,我会删除这个)。我可以为你做这件事,但这比我准备花费更多的精力来建立一个完整的项目进行测试。请随意编辑这个答案的结果,或张贴自己的(在这种情况下,我会删除这个)。