如何使用Spring Data Repositories处理大量数据?

Jos*_*rdo 12 spring repository spring-data

我有一个大表,我想通过Spring Data Repository访问.

目前,我正在尝试扩展PagingAndSortingRepository接口,但似乎我只能定义返回列表的方法,例如:

public interface MyRepository extends 
        PagingAndSortingRepository<MyEntity, Integer>
{
  @Query(value="SELECT * ...")
  List<MyEntity> myQuery(Pageable p);
}
Run Code Online (Sandbox Code Playgroud)

另一方面,findAll()附带的方法PagingAndSortingRepository返回一个Iterable(我想数据没有加载到内存中).

是否可以定义同时返回Iterable和/或不会立即将所有数据加载到内存中的自定义查询?

有没有办法处理大型桌子?

Oli*_*ohm 9

我们在这里有经典的咨询答案:这取决于.由于该方法的实现是特定于商店的,因此我们依赖于底层商店API.在JPA的情况下,没有机会提供流媒体访问作为….getResultList()返回a List.因此,我们还List向客户端公开,特别是JPA开发人员可能习惯使用列表.因此,对于JPA,唯一的选择是使用分页API.

对于像Neo4j这样的商店,我们支持流式访问,因为存储库返回IterableCRUD方法以及finder方法的执行.


zag*_*gyi 6

执行findAll()只是加载所有实体到内存中的整个列表。它的Iterable返回类型并不意味着它实现了某种数据库级别的游标处理。

另一方面,您的自定义myQuery(Pageable)方法只会加载一页实体,因为生成的实现遵循其Pageable参数。您可以将其返回类型声明为PageList。在后一种情况下,您仍然会收到相同(受限)数量的实体,但不会收到Page额外携带的元数据。

因此,您基本上做了正确的事情,以避免在自定义查询中将所有实体加载到内存中。

请在此处查看相关文档