5

データベース エクスポートを含む 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でこれを行う方法はありますか? 私はScrollableResultsHibernateから知っていますが、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 オブジェクトを返すという事実は、それに関するドキュメントを見つけることができませんが、それらを遅延ロードする可能性があると思います。

ありがとう、ステフ。

4

0 に答える 0