Java Spring : MongoRepository count() and findAll()



我注意到 mongo 的 Spring 数据中有些奇怪:

MongoRepository扩展CrudRepositoryfindAll()返回一个Iterablecount()方法可以,因为它返回一个long

class CrudRepository {
...
Iterable<T> findAll();
long count();
}

在 mongoMongoRepository中,findAll()方法引用一个List

class MongoRepository extends CrudRepository {
...  
@Override
List<T> findAll();
}

但是List#size()返回一个int,而MongoRepository#count()方法保持返回长整型。

当集合超过Integer.MAX_VALUE时会发生什么!?我们还能打电话给List<T> findAll()吗?

我喜欢你的观点:)根据您对此问题提出的问题,此问题看起来很相似。

正如 Java 语言规范:15.10.1 中提到的。数组创建表达式:

每个维度表达式都会经历一元数值提升 (§5.6.1(。升级的类型必须为 int,否则会发生编译时错误。

由于 dimension 必须是 int,我们可以在数组中存储最大大小2,147,483,648,并且考虑到 ArrayList 只不过是一个数组,我们不能存储超过 INTEGER。MAX_VALUE数组列表中。(当然,List的不同实现可能会有不同的行为(

Spring Data JPA允许您自定义查询方法。您始终可以自由创建一个返回类型为可迭代的查询方法。

@Override
Iterable<T> findAll();

来自java.util.List#sizejavadoc:

返回此列表中的元素数。如果此列表包含Integer.MAX_VALUE个以上的元素,则返回Integer.MAX_VALUE

因此,当集合大小超过Integer.MAX_VALUE时,size方法将返回Integer.MAX_VALUE

我们还能打电话给List<T> findAll()吗?

是的,但很可能调用会失败并显示OutOfMemoryError

最新更新