web-dev-qa-db-fra.com

Mettre à jour un champ unique à l'aide des données de printemps jpa

J'utilise les référentiels de spring-data - chose très pratique mais j'ai rencontré un problème. Je peux facilement mettre à jour l'entité entière mais je pense que c'est inutile quand je dois mettre à jour un seul champ:

@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;

pour mettre à jour, j'appelle simplement la méthode save. Dans le journal, je vois ce qui suit:

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 

J'aimerais voir quelque chose comme ça:

batching 1 statements: 1: update processors.ear_attachment set status=2 where id=1 

Les référentiels de Spring ont beaucoup de fonctionnalités pour sélectionner quelque chose en utilisant les conventions de nom, peut-être qu'il y a quelque chose de similaire pour la mise à jour comme updateForStatus (int status);

24
Dmitrii Borovoi

Vous pouvez essayer quelque chose comme ceci:

@Modifying
@Query("update EARAttachment ear set ear.status = ?1 where ear.id = ?2")
int setStatusForEARAttachment(Integer status, Long id);

Vous pouvez également utiliser des paramètres nommés, comme ceci:

@Modifying
@Query("update EARAttachment ear set ear.status = :status where ear.id = :id")
int setStatusForEARAttachment(@Param("status") Integer status, @Param("id") Long id);

La valeur de retour int est le nombre de lignes mises à jour. Vous pouvez également utiliser void return.

Voir plus dans la documentation référence .

42
Bruno César

Hibernate propose l'annotation @DynamicUpdate. Tout ce que nous devons faire est d'ajouter cette annotation au niveau de l'entité:

@Entity(name = "EARAttachment ")
@Table(name = "EARAttachment ")
@DynamicUpdate
public class EARAttachment {
    //Code omitted for brevity
}

Maintenant, lorsque vous utilisez EARAttachment.setStatus(value) et exécutez "CrudRepository" save(S entity), il ne mettra à jour que le champ particulier. par exemple. l'instruction UPDATE suivante est exécutée:

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