在 spring-data-jpa 中设置延迟加载集合的批量大小

Ste*_*tef 5 jpa spring-data-jpa

我需要生成一个包含数据库导出的 CSV 文件。由于数据可能非常大,我想使用特定批量大小的延迟加载,这样当我迭代 DAO/Repository 返回的集合时,我只会在某个时刻加载一批。我希望这由集合自动完成(例如,否则我可以仅加载一页又一页,用作Pageable参数)。

这是一些代码,希望能让事情变得更清楚。我的控制器看起来像这样:

public ModelAndView generateCsv(Status status) {
    //can return a large number of items.
    Collection<Item> items = itemRepository.findByStatus(status);

    return new ModelAndView("csv", "items", items);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我将该集合传递给视图(通过 ModelAndView 对象),视图将迭代它并生成 CSV。

我希望集合知道如何在内部加载下一批,这是延迟加载集合通常应该做的事情。

有没有办法用 Spring-data 或普通的 JPA 来做到这一点?我从 Hibernate 了解到ScrollableResults,但我不喜欢它有两个原因:它不是 JPA(我必须使我的代码依赖于 Hibernate),并且它不使用集合 API,因此我必须发表我的观点了解 ScrollableResults。至少如果它能够实现Iterable,那就会变得更好,但事实并非如此。

因此,我正在寻找一种使用特定批量大小来指定集合要延迟加载的方法。也许是这样的:

@Query("SELECT o FROM Item o WHERE o.status = ?1")
@Fetch(type = FetchType.LAZY, size = 100)
Page<Item> findByStatus(Item.Status status);
Run Code Online (Sandbox Code Playgroud)

如果使用 Spring Data 无法实现类似的操作,您知道是否可以使用 QueryDsl 来完成?QueryDsl 存储库返回 Iterator 对象这一事实让我认为它可能会延迟加载这些对象,尽管我找不到这方面的文档。

谢谢,斯特夫。