蓄積された過去のデータベースのデータを削除するバッチアプリケーションを追加しようとした時に、JPAを使って削除処理を書こうと思ったときに若干苦戦したのでメモっておく。
Query methodsがあるかなと思ったけど、日付を指定して削除するロジックはうまく出来なさそうだったから、@Queryアノテーション付けてSQLを呼ぶように変更。
1 2 3 4 |
@Transactional @Modifying @Query("delete from History t where t.playedAt < :date") void deletePastPlayedHistory(@Param("date")Date deleteDate); |
注意1
テーブル名、カラム名を指定するときは、Entityクラスに従って指定する事。最初、普通に以下のようにSQLを書いて「tbl_played_songs is not mapped」のようにマッピング出来ねぇよと怒られた。
1 2 3 4 |
@Transactional @Modifying @Query("delete from tbl_played_songs t where t.played_at < :date") void deletePastPlayedHistory(@Param("date")Date deleteDate); |
注意2
削除するときは、@Modifyingと@Transactinalを付ける。付けないと「Not supported for DML operations」、「TransactionRequiredException: Executing an update/delete query;」とかで怒られる。まぁそうよね。