2016-02-16 39 views
2

我有一個帶有JPARepository的Spring Boot應用程序來管理MySQL數據庫中的數據。目前,我有這個疑問譯註:Spring JPA使用RowCount刪除查詢

@Query("SELECT COUNT(*) FROM Tweetpost t") 
int findRowCount(); 

隨着INT findRowCount();我可以看到有多少行填充到數據庫,現在我想刪除所有的行,即超過100所以數據庫不應該超過100行,否則它應該刪除一切之上100.我只是有這個尚未:

@Modifying 
@Transactional 
@Query(DELETE) 
int removeOldRows(); 
+0

那麼這裏有什麼問題? – Ankit

+1

你將如何定義,哪些行已被刪除?它應該是最古老的行,還是應該是具有最小特定字段值的行? –

+0

只是最古老的樹林。因此,如果我在db中有105條記錄,它應該刪除最老的5條。 – julien

回答

2

不幸的是JPQL不能使用limit關鍵詞。但是你可以分兩步做。首先 - 獲取最新ID的有限列表。其次 - 刪除所有推文,這些id不在此列表中。我想,因爲你想刪除最舊的記錄,你有類似date列。

申報庫兩種方法:

@Repository 
public TweetpostRepository extends CrudRepository<Tweetpost , Integer>{ 

    @Query("select t.id from TweetPost t order by t.date desc") 
    public Page<Integer> findLatestId(Pageable pageable); 

    @Modifying 
    @Transactional 
    @Query("delete from TweetPost t where t.id not in (:idList)") 
    public void deleteByExcludedId(@Param("idList") List<Integer> idList); 

    ... 
} 

注意,我們使用desc排序,因爲我們需要的最新記錄的ID。現在你可以在控制器旁邊的方式來使用它:

@Service 
public class MyService { 

    @Autowired 
    private TweetpostRepository repository; 

    public void trunkateTweetposts(){ 
     Page<Integer> page = repository.findLatestId(new PageRequest(0, 10)); 
     repository.deleteByExcludedId(page.getContent()); 
     ... 
    } 

} 

在這個例子中10是要保留記錄的計數。

+0

代碼中存在一些錯誤。在回購中,你用兩個T和控制器寫了「Latest」,你的意思是我認爲公共無效。 – julien

+1

@julien thanx,我糾正了錯字。我認爲contoller中的方法會返回重定向字符串。例如重定向回到列表視圖。但是,如果你不需要它,你可以使用'public void'。萬一你會用ajax做這個場景。 –

+0

不,它應該只屬於後端,我有一個家務服務,它「觀察」數據庫。 – julien