私は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;
更新するには、メソッドsaveを呼び出します。ログには次のように表示されます。
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
私はこのようなものを見たいです:
batching 1 statements: 1: update processors.ear_attachment set status=2 where id=1
Springのリポジトリには、名前の規則を使用して何かを選択する機能がたくさんあります。おそらくupdateForStatus(int status)のような更新用の似たようなものがあります。
次のようなものを試すことができます:
@Modifying
@Query("update EARAttachment ear set ear.status = ?1 where ear.id = ?2")
int setStatusForEARAttachment(Integer status, Long id);
次のように、名前付きパラメーターを使用することもできます。
@Modifying
@Query("update EARAttachment ear set ear.status = :status where ear.id = :id")
int setStatusForEARAttachment(@Param("status") Integer status, @Param("id") Long id);
Intの戻り値は、更新された行の数です。 void
returnも使用できます。
詳細は reference documentationをご覧ください。
Hibernateは@DynamicUpdateアノテーションを提供します。エンティティレベルでこのアノテーションを追加するだけです。
_@Entity(name = "EARAttachment ")
@Table(name = "EARAttachment ")
@DynamicUpdate
public class EARAttachment {
//Code omitted for brevity
}
_
現在、EARAttachment.setStatus(value)
を使用して「CrudRepository」save(S entity)
を実行すると、特定のフィールドのみが更新されます。例えば次のUPDATEステートメントが実行されます。
_UPDATE EARAttachment
SET status = 12,
WHERE id = 1
_