使用spring数据jpa更新单个字段

Dmi*_*voi 27 java spring updates spring-data spring-data-jpa

我正在使用spring-data的存储库 - 非常方便,但我遇到了一个问题.我可以轻松更新整个实体,但我相信当我只需要更新一个字段时,这是毫无意义的:

@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;
Run Code Online (Sandbox Code Playgroud)

更新我只是调用方法保存.在日志中我看到了跟随:

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 
Run Code Online (Sandbox Code Playgroud)

我想看到这样的事情:

batching 1 statements: 1: update processors.ear_attachment set status=2 where id=1 
Run Code Online (Sandbox Code Playgroud)

Spring的存储库有很多工具可以使用名称约定来选择一些东西,也许像updateForStatus(int status)这样的更新有类似的东西;

Bru*_*sar 46

你可以尝试这样的事情:

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

你也可以使用named params,如下所示:

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

int返回值是更新的行数.您也可以使用voidreturn.

参考文档中查看更多内容


Vij*_*jai 10

Hibernate提供@DynamicUpdate注释.我们需要做的就是在实体级别添加此注释:

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

现在,当您使用EARAttachment.setStatus(value)并执行"CrudRepository"时save(S entity),它将仅更新特定字段.例如,执行以下UPDATE语句:

UPDATE EARAttachment 
SET    status = 12,
WHERE  id = 1
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的最大缺点是您需要先选择并绑定实体,然后才能更新它的值。正确的? (4认同)
  • @AndreyM.Stepanov 是的,将生成 UPDATE SQL。另请注意,“@DynamicUpdate”具有一些性能开销,如 https://www.baeldung.com/spring-data-jpa-dynamicupdate 中所述。仅当列数较多时使用。 (3认同)