Frage

Ich möchte alle Felder einer Tabelle aktualisieren, den Wert colum Namen als ‚PCNAME‘ hat. Der Tabellenname, die ich aktualisieren möchten ist XYZ.I nur einige Felder aktualisieren möchten, und halten nicht etwas unverändert.

Dies wird viele Zeilen beeinflussen und nicht eine einzige Reihe, da es viele Zeilen mit NAME wird = ‚PCNAME‘ Wie kann ich es tun JPA.I haben Entity-Klasse mit dieser Tabelle verknüpft.

War es hilfreich?

Lösung

Sie können entweder tun es die objektorientierte Art und Weise oder mit einer Aktualisierungsabfrage.

Objektorientiert:

public void setNameOfAllEntities(String newname){
    List<MyEntity> items =
        entityManager.createQuery("from MyEntity", MyEntity.class)
            .getResultList();
    for(MyEntity entity : items){
        entity.setName(newname);
    }
}

Mit Update Query (nicht getestet):

public void setNameOfAllEntities(final String newname){

    final int changes =
        entityManager.createQuery("update MyEntity set name = :name")
            .setParameter("name", newname)
            .executeUpdate();

    System.out.println(changes + " rows changed");

}

Offensichtlich sind die zweite Version eine bessere Leistung.

Andere Tipps

seanizer ist Antwort korrekt ist (1) und eine Schütt Update würde für diesen Anwendungsfall in der Tat schön. Aber Sie müssen einige Vorsichtsmaßnahmen mit Bulk-Update-Operationen nehmen. Um die JPA-Spezifikation paraphrasieren:

  • Bulk-Updates Bypass optimistische Sperren Kontrollen (so Sie manuell die Version Spalte erhöhen müssen und / oder manuell die Version Spalte validieren, wenn gewünscht)
  • die Persistenzkontext nicht mit dem Ergebnis der Bulk-Operationen synchronisiert wird (so Bulk-Operationen einer Transaktion in einer separaten Transaktion oder ganz am Anfang durchgeführt werden sollte, bevor der Zustand der Einheit geladen, dass betroffen sein könnte).

würde Mein Vorschlag ist also zumindest Erhöhung des Versionsspalt zu vermeiden Concurrency Problem mit anderen Threads:

UPDATE XYZ xyz
SET xyz.name = :newname, xyz.version = xyz.version + 1 

Und es in einer separaten Transaktion durchzuführen oder, bevor sie eine XYZ Laden wie zuvor erläutert.

Referenzen

  • JPA 1.0-Spezifikation
    • Abschnitt 4.10 "Bulk-Update und Delete-Operationen"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top