wake-up-neo.com

Aktualisieren Sie ein einzelnes Feld mit den Federdaten jpa

Ich verwende die Repositorys von spring-data - sehr praktisch, aber ich hatte ein Problem. Ich kann problemlos die gesamte Entität aktualisieren, aber ich halte es für sinnlos, wenn ich nur ein einziges 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 updaten rufe ich einfach method 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 Spring-Repositorys verfügen über zahlreiche Funktionen, mit denen Sie mithilfe von Namenskonventionen etwas auswählen können. Möglicherweise gibt es für das Update etwas Ähnliches wie updateForStatus (int status).

24
Dmitrii Borovoi

Sie können so etwas ausprobieren:

@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 void return verwenden.

Weitere Informationen finden Sie in der Referenz Dokumentation.

42
Bruno César

Hibernate bietet die Annotation @DynamicUpdate. 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
}

Wenn Sie nun EARAttachment.setStatus(value) verwenden und "CrudRepository" save(S entity) ausführen, wird nur das bestimmte Feld aktualisiert. z.B. Die folgende UPDATE-Anweisung wird ausgeführt:

UPDATE EARAttachment 
SET    status = 12,
WHERE  id = 1
9
Vijai