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);
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 .
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