2012-04-02 3 views
5

CriteriaQuery in JPA2.0 bietet eine typsichere Möglichkeit zur Auswahl, es ist großartig. Aber ich frage mich, warum es keine Aktualisierung/Löschung Operation zur Verfügung stellen wird? Um das Bulk Update/Delete zu machen, müssen Sie auf alte Zeiten zurückgreifen und fehleranfällige SQL- oder JPQL-Texte schreiben. IMO, CriteriaQuery für update/delete sollte sich nicht als schwierig herausstellen, da die Behandlung von where cause mit select identisch ist.Warum bietet JPA CriteriaQuery keine Aktualisierungsabfrage?

Ich hoffe, dies würde in der nächsten Version von JPA implementiert werden.

+1

Ihr Wunsch ist in Erfüllung gegangen :) seit JPA 2.1 gibt es 'CriteriaUpdate' verfügbar –

Antwort

1

Da JPA das ORM-Tool ist, dessen Motivation es ist, die Datenbankeinträge den Objekten so zuzuordnen, dass die Datenbankeinträge mit der Programmiersprache anstelle von SQL manipuliert werden können, wird die Verwendung von SQL/HQL/JPQL nicht empfohlen um das Update durchzuführen.

Um zu verhindern, fehleranfällige SQL oder JPQL zu verwenden, um die Objekte zu aktualisieren, nachdem Sie 10 verwenden, um eine Objektliste abzurufen, können Sie einfach die Ergebnisobjekte durchlaufen und dann die Eigenschaften des Objekts nacheinander ändern Um die Bulk-Aktualisierung durchzuführen oder zu löschen. JPA sollte in der Lage sein, die an diesen Objekten vorgenommenen Änderungen zu erkennen und die entsprechenden SQL-Anweisungen zu generieren, um die entsprechenden Datensätze in einem Batch zu aktualisieren, wenn der EntityManager.flush() aufgerufen wird.

+4

Das hört sich vernünftig an. Es handelt sich jedoch um mindestens zwei Transaktionen. Wenn die Datensätze sehr groß sind, z. B. das Löschen einer Million Datensätze, ist dieser Weg nicht akzeptabel. Ich denke nur, dass die CriteriaQuery bereits in SQL-Weise gearbeitet hat, die einige Bedingungen angibt, dann die Arbeit erledigt. Warum nicht auch das Löschen/Aktualisieren in diesem Stil unterstützen? Wie auch immer, momentan muss ich mit normalem SQL für Batch-Löschen/Aktualisieren gehen, wenn der Betrag groß ist. –

+1

@zx_wing gültiger Punkt, deshalb wurde in JPA 2.1 "CriteriaUpdate" eingeführt –