Java で使用できるオブジェクト/リレーショナル マッピング (ORM) ツールの 1 つがこれらの要件を満たすことを願っています。
- JPA またはネイティブ SQL クエリを使用して、多数の行をフェッチし、それらをエンティティオブジェクトとして返します。
- 行 (エンティティ) の反復と、現在のエンティティに変更を加えた後の永続化を許可します。
複雑なバッチ操作を実行したいと考えています (実際には、ファイルからの既知の適切なデータをデータベース内のデータと比較して調整しています) 1 行ずつ実行します。もっと簡単なら、JDBC を使って SQL を実行するしかありません。しかし、この場合、Bean からデータベースに直接移行することで本当にメリットが得られます。
SQL では、更新可能なカーソルを使用して目標を効率的に達成できました。
参考までに、組み込みの Java H2 環境でこれらすべてをテストしています。
JPAクエリ
私の最初の素朴な試みは、エンティティ Bean を正常に返すQuery.getResultList()を呼び出すことでしたが、それらは「切断」されています。私が呼び出すとpersistenceUnitUtil.getIdentifier(myEntity)
、それはエンティティタイプではないと不平を言います。
休止状態
次に、ScrollableResultsをサポートする Hibernate を調査しました。このインターフェイスを使用すると、個々の列の値を名前で取得できますが、エンティティは取得できません。
EclipseLink
次は、ScrollableCursorをサポートする EclipseLink でした。私はこれを次のように使用して、これに大きな期待を寄せました。
Query query = entityManager.createQuery(jpaQuery);
query.setHint("eclipselink.cursor", true);
CursoredStream cursoredStream = (CursoredStream)query.getSingleResult();
残念ながらcursoredStream.next();
、エンティティの「切断された」バージョンが再び返されます。そのため、エンティティに書き戻す方法がわかりません。
結論
私は現在、少なくともエンティティの @Id をクエリの一部として返す方法を調査しています (残念ながら、ツールを柔軟に保ちたいので、キーとして文字列を使用したり、複合キー オブジェクトを使用したりすることがあります)。これにより、少なくとも行を反復処理してから、各エンティティを個別に検索して永続化することができます。
しかし、私が好むのは、JPA に接続されたエンティティを取得し、それを変更して永続化できるようにする、カーソルに基づくイテレータを用意することです。
これがいずれかの ORM ツールの既知の機能でない場合は、おそらくあきらめて、古き良き JDBC に頼る必要があります。