6

右-データベースから1,000,000レコードを削除したい(例)。これには長い時間がかかります->トランザクションがタイムアウトして失敗します。だから-私はそれらをバッチで削除し、トランザクションごとに25000レコードと言います。MySQLのlimit句またはOracleのROWNUMを使用します。これはうまくいきます。

これをデータベースに依存しない方法で実行したいと思います。また、JPA/Hibernateを使用する既存のJavaコードベースから。

運が悪い。JPA Query.setMaxResultsおよびsetFirstResultは、書き込み'クエリ'(削除など)には影響しません。多くのエンティティをメモリに選択して個別に削除するのは非常に遅く、ばかげていると思います。

そのため、ネイティブクエリを使用して、アプリケーションコードの「limit」句を管理します。この句をorm.xmlにカプセル化すると便利ですが、...「HibernateAnnotations 3.2は、ネイティブクエリを使用した一括更新/削除をサポートしていません。」-http ://opensource.atlassian.com/projects/hibernate/browse/ANN-469

これはよくある問題だと思います。誰かがより良いデータベースに依存しないソリューションを手に入れましたか?

4

4 に答える 4

5

非建設的な回答をするのは嫌いですが、ORM はデータベースで一括操作を行うためのものではありません。したがって、これらの操作にはおそらくネイティブクエリが最適なようです。

また、データベースの新しい状態を反映するように ORM が更新されていることを確認する必要があります。そうしないと、奇妙なことが起こる可能性があります。

ORM は、オブジェクトをデータベースにマッピングするための優れたツールですが、一般に汎用データベース インターフェイスではありません。

于 2009-02-09T12:51:52.950 に答える
0

クエリの制限はデータベース固有の機能であり、SQL 標準はありません (存在することに同意します)。

ほとんどのデータベースで機能するソリューションは、ビューを使用して複数のテーブルを 1 つにグループ化することです。各テーブルには、データのサブセット (1 日など) が含まれています。これにより、サブセット全体を一度に削除できます。とはいえ、多くのデータベースでは、このようなビューで UPDATE および INSERT を実行すると問題が発生します。

通常、INSERT/UPDATE のビューまたはエイリアス (単一のテーブル、つまり「現在の」テーブルを指す) と検索用のグループ化ビューを作成することで、これを回避できます。

一部のデータベースでは、基本的に同じものであるパー​​ティションも提供されますが、行が (INSERT で) 基になるテーブルに移動する必要があることを指定する列を定義できる点が異なります。サブセットを削除する必要がある場合は、基になるテーブルの 1 つを削除または切り捨てることができます。

于 2009-02-09T12:46:06.550 に答える
0

永続化コンテキストとキャッシュをバイパスし、(結果の SQL) ステートメントを直接実行する HQL (JPA QL) 直接 DML 操作を使用できると思います。

Query q = session.createQuery("delete YourEntity ye where ye.something like :param");
q.setParameter("param", "anything");
int deletedEntities = q.executeUpdate();
于 2009-02-09T22:05:55.130 に答える
-2

q.setMaxResults(int)

...ソニー

于 2010-11-19T09:16:22.870 に答える