2012-04-02 8 views
5

JPA2.0のCriteriaQueryは、選択を行うための型セーフな方法を提供します。しかし、なぜそれが更新/削除操作を提供しないのだろうかと思っていますか?一括更新/削除するには、エラーが発生しやすいSQLまたはJPQLテキストを書き込む前の時間に戻す必要があります。 IMO、更新/削除のためのCriteriaQueryは、whereの原因の処理がselectと同じであるため、困難ではありません。JPA CriteriaQueryが更新クエリを提供しないのはなぜですか?

これは、JPAの次のバージョンで実装されることを願っています。

+1

JPA 2.1以降、「CriteriaUpdate」が利用可能です –

答えて

1

JPAはSQLの代わりにプログラミング言語を使用してデータベースレコードを操作できるようにデータベースレコードをオブジェクトにマップすることを目的としたORMツールであるため、SQL/HQL/JPQLの使用を推奨していません更新を実行します。

エラーの発生しやすいSQLまたはJPQLを使用してオブジェクトを更新しないようにするには、CriteriaQueryを使用してオブジェクトのリストを取得したら、結果オブジェクトをループしてからオブジェクトのプロパティを1つずつ変更します一括更新または削除を実行するJP300は、これらのオブジェクトに対して行われた変更を検出し、EntityManager.flush()が呼び出されたときに、対応するレコードをバッチで更新するための適切なSQLを生成する必要があります。

+4

これは妥当なようです。しかし、少なくとも2つのトランザクションが含まれています。レコードが膨大な場合(たとえば、100万レコードを削除する場合など)、この方法は受け入れられません。私は、CriteriaQueryがすでにいくつかの条件を指定してSQLのやり方で作業していると思っています。なぜこのスタイルでも削除/更新をサポートしないでください。とにかく、現在、バッチ削除/更新のために、量が大きい場合はプレーンSQLを使用する必要があります。 –

+1

@zx_wingの有効なポイントです。そのため、JPA 2.1では 'CriteriaUpdate'が導入されました –

関連する問題