java - query - Actualizar solo campo usando datos de primavera jpa
spring data query native (2)
Estoy usando los repositorios de Spring-data, algo muy conveniente, pero me enfrenté a un problema. Fácilmente puedo actualizar la entidad completa, pero creo que no tiene sentido cuando necesito actualizar solo un campo:
@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;
para actualizar acabo de llamar método guardar. En el registro veo el siguiente:
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
Me gustaría ver algo como esto:
batching 1 statements: 1: update processors.ear_attachment set status=2 where id=1
Los repositorios de Spring tienen muchas facilidades para seleccionar algo usando las convenciones de nombres, tal vez haya algo similar para actualizar como updateForStatus (estado int);
Hibernate ofrece la anotación @DynamicUpdate. Todo lo que necesitamos hacer es agregar esta anotación en el nivel de la entidad:
@Entity(name = "EARAttachment ")
@Table(name = "EARAttachment ")
@DynamicUpdate
public class EARAttachment {
//Code omitted for brevity
}
Ahora, cuando use EARAttachment.setStatus(value)
y ejecute "CrudRepository" save(S entity)
, actualizará solo el campo en particular. Por ejemplo, se ejecuta la siguiente instrucción UPDATE:
UPDATE EARAttachment
SET status = 12,
WHERE id = 1
Puedes probar algo como esto:
@Modifying
@Query("update EARAttachment ear set ear.status = ?1 where ear.id = ?2")
int setStatusForEARAttachment(Integer status, Long id);
También puedes usar params nombrados, como este:
@Modifying
@Query("update EARAttachment ear set ear.status = :status where ear.id = :id")
int setStatusForEARAttachment(@Param("status") Integer status, @Param("id") Long id);
El valor de retorno int es el número de filas que se actualizaron. También puede utilizar el retorno void
.
Ver más en la documentación de reference .