Aktualisieren Sie ein einzelnes Feld mit Federdaten jpa

Lesezeit: 3 Minuten

Benutzer-Avatar
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);

Benutzer-Avatar
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.

Sehen Sie mehr in Hinweis Dokumentation.

  • 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

Benutzer-Avatar
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.

public static void applyChanges(Object entity, Map<String, Object> map, String[] ignoreFields) {
    map.forEach((key, value) -> {
        if(!Arrays.asList(ignoreFields).contains(key)) {
            try {
                Method getMethod = entity.getClass().getMethod(getMethodNameByPrefix("get", key));
                Method setMethod = entity.getClass().getMethod(getMethodNameByPrefix("set", key), getMethod.getReturnType());
                setMethod.invoke(entity, value);
            } catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    });
}

1099910cookie-checkAktualisieren Sie ein einzelnes Feld mit Federdaten jpa

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy