データベース エクスポートを含む CSV ファイルを生成する必要があります。データは非常に大きくなる可能性があるため、特定のバッチ サイズで遅延読み込みを使用して、DAO/リポジトリから返されたコレクションを反復処理するときに、1 つの時点でのみバッチが読み込まれるようにします。これがコレクションによって自動的に行われるようにしたい (たとえば、そうでなければ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から知っていますが、2つの理由で好きではありません.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 オブジェクトを返すという事実は、それに関するドキュメントを見つけることができませんが、それらを遅延ロードする可能性があると思います。
ありがとう、ステフ。