5

我需要生成一个包含数据库导出的 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);
}

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

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

有没有办法用 Spring-data 或简单的 JPA 来做到这一点?我ScrollableResults从 Hibernate 知道,但我不喜欢它有两个原因:它不是 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);

如果使用 Spring Data 无法做到这样的事情,你知道是否可以使用 QueryDsl 来完成吗?QueryDsl 存储库返回 Iterator 对象的事实使我认为它可能会延迟加载这些对象,尽管我找不到关于此的文档。

谢谢,史蒂夫。

4

0 回答 0