Aktualisieren Sie ein einzelnes Feld mit Federdaten jpa
Lesezeit: 3 Minuten
Dmitrij Borowoi
Ich verwende die Repositories von Spring-Data – sehr praktisch, aber ich hatte ein Problem. Ich kann problemlos die gesamte Entität aktualisieren, aber ich glaube, es ist sinnlos, wenn ich nur ein einzelnes Feld aktualisieren muss:
@Entity
@Table(schema = "processors", name = "ear_attachment")
public class EARAttachment {
private Long id;
private String originalName;
private String uniqueName;//yyyy-mm-dd-GUID-originalName
private long size;
private EARAttachmentStatus status;
Zum Aktualisieren rufe ich einfach die Methode save auf. Im Log sehe ich folgendes:
batching 1 statements: 1: update processors.ear_attachment set message_id=100,
original_name="40022530424.dat",
size=506,
status=2,
unique_name="2014-12-16-8cf74a74-e7f3-40d8-a1fb-393c2a806847-40022530424.dat"
where id=1
Ich würde gerne so etwas sehen:
batching 1 statements: 1: update processors.ear_attachment set status=2 where id=1
Die Repositories von Spring haben viele Möglichkeiten, etwas anhand von Namenskonventionen auszuwählen, vielleicht gibt es etwas Ähnliches für update wie updateForStatus(int status);
Bruno Ribeiro
Sie können so etwas auf Ihrer Repository-Oberfläche versuchen:
@Modifying
@Query("update EARAttachment ear set ear.status = ?1 where ear.id = ?2")
int setStatusForEARAttachment(Integer status, Long id);
Sie können auch benannte Parameter wie folgt verwenden:
@Modifying
@Query("update EARAttachment ear set ear.status = :status where ear.id = :id")
int setStatusForEARAttachment(@Param("status") Integer status, @Param("id") Long id);
Der int-Rückgabewert ist die Anzahl der Zeilen, die aktualisiert wurden. Sie können auch verwenden void Rückkehr.
Danke, funktioniert jetzt, aber ich frage mich, ob es besser ist als die Verwendung von entityManager.creatQuery (..)? Ich suche etwas Typsicheres
– Dmitrij Borowoi
23. März 2015 um 4:27 Uhr
@DmitriiBorovoi Dies wird auch anrufen em.createQuery, wenn ich mich recht erinnere, ist das dasselbe. Wenn Sie etwas Typsicheres wollen, müssen Sie wissen, welche Attribute geändert wurden, um die Abfrage zu erstellen. Danach können Sie das benutzerdefinierte Repository verwenden, um die Abfrage auszuführen (docs.spring.io/spring-data/data-jpa/docs/current/reference/html/…).
– Bruno Ribeiro
23. März 2015 um 10:00 Uhr
Vijai
Hibernate bietet die Annotation @DynamicUpdate an. Alles, was wir tun müssen, ist, diese Anmerkung auf Entitätsebene hinzuzufügen:
@Entity(name = "EARAttachment ")
@Table(name = "EARAttachment ")
@DynamicUpdate
public class EARAttachment {
//Code omitted for brevity
}
Nun, wenn Sie verwenden EARAttachment.setStatus(value) und Ausführen von “CrudRepository” save(S entity), wird nur das jeweilige Feld aktualisiert. zB wird die folgende UPDATE-Anweisung ausgeführt:
UPDATE EARAttachment
SET status = 12,
WHERE id = 1
Entschuldigung, und welche Anweisung wird ausgeführt, wenn ich @DynamicUpdate nicht verwende? Wird die Update-Anweisung weiterhin verarbeitet, wenn ich nach dem Setter save() mache?
– Andrej M. Stepanow
21. Februar 2019 um 10:54 Uhr
@AndreyM.Stepanov Ja, UPDATE SQL wird generiert. Und beachte das auch @DynamicUpdate hat einen gewissen Leistungsaufwand, wie in erläutert baeldung.com/spring-data-jpa-dynamicupdate. Nur verwenden, wenn die Anzahl der Spalten groß ist.
– Der Codierer
6. September 2019 um 3:37 Uhr
Der größte Nachteil dieses Ansatzes besteht darin, dass Sie die Entität zuerst auswählen und binden müssen, bevor ihr Wert aktualisiert werden kann. Richtig?
– Andrew T. Finnell
30. April 2020 um 20:21 Uhr
Sie können use databind aktualisieren, um @PathVariable T-Entität und @RequestBody Map-Body zuzuordnen. Und sie aktualisieren Körper -> Entität.