7

JPAクエリを作成するループにいるとしましょう:

for(A elem : collection) {
  emanager.createQuery("update A a set a.x=:y where a.id=:id")
          .setParameter("id",elem.id)
          .setParameter(":y", 123)
          .executeUpdate();
}

返されたQueryインスタンスを再利用できますか?

Query query = emanager.createQuery("update A a set a.x=:y where a.id=:id");
for(A elem : collection) {
  query
          .setParameter("id",elem.id)
          .setParameter(":y", 123)
          .executeUpdate();
}

のすべてのインスタンスに適用されますQueryか? NamedQueryNativeQueryなど もちろん、EntityManager同じトランザクション内、つまり同じトランザクション内でインスタンスを再利用することについて話しています。

4

3 に答える 3

0

ループ内で同じクエリ(更新)を実行して、まったく同じことを試しましたが、2回目の実行で「データの不一致」が発生しました。したがって、createQuery をループ内に配置すると、正常に動作します。まさに私が期待していたものではありません。JPQLではなく、NamedNativeQueryです。

于 2016-05-05T18:20:15.343 に答える
-2

クエリで再利用できます。私が働いてみた限り。

于 2012-06-27T14:37:36.023 に答える
-5

EntityManager メソッドを使用して、データベースへのレジスタを永続化、更新、削除してみませんか?

emanager.persist(elem); // creates a register in the database, set the annotation for autoincrement id of new registers in the Entity for better performance.

emanager.merge(elem); // updates a register in the database, chance the values of the Entity values and merge to persist changes to the register.

emanager.remove(emanager.merge(elem)); // delete registers from database, you need to merge de entity before deleting to avoid deleting problems.

これを行うことができ、正常に動作します:

for(A elem : collection) emanager.merge(elem);
于 2012-06-27T16:43:27.873 に答える