2016-02-22 54 views
4

我使用Spring JPA存儲庫在我的數據庫中保存了Twitter推文。推文的日期被保存爲MySQL數據庫中的日期時間。現在我想刪除所有超過一年的推文。我看到有功能CURRENT_TIME,我想到了像CURRENT_TIME - 360。我知道這不是正確的語法,但我不知道如何做到這一點。這裏是我有:刪除超過1年前的記錄

@Modifying 
@Transactional 
@Query("DELETE FROM Tweetpost t WHERE t.createdAt > ") 
int removeOlderThan(); 

編輯解決:

庫:

@Modifying 
    @Transactional 
    @Query("DELETE FROM Tweetpost m WHERE m.createdAt < :date") 
    int removeOlderThan(@Param("date") java.sql.Date date); 

服務:

public void removeOldItems() { 
     Calendar cal = Calendar.getInstance(); 
     cal.add(Calendar.DATE, -360); 

     java.sql.Date oneYear = new java.sql.Date(cal.getTimeInMillis()); 

     tweetRepository.removeOlderThan(oneYear); 


    } 
+0

'WHEREt.createdAt Strawberry

+0

不適JPQL。 – julien

+0

那麼爲什麼這個標記爲mysql? – Strawberry

回答

5

爲此,您需要2個步驟。首先,您需要一種方法,將參數作爲您要刪除郵件的日期,而您根本不需要註釋。

所以在你的倉庫,你必須像

@Modifying 
    public void deleteByCreatedAtBefore(Date expiryDate); 

現在,在您的服務方法,你將計算日期,並把它傳遞這樣

public void performTweetCleanup(){ 
     //calculate date 
     Calendar cal = Calendar.getInstance(); 
     Date today = cal.getTime(); 
     cal.add(Calendar.YEAR, -1); 
     Date previousYear = cal.getTime(); 

     //call the method 
     MyTweeterRepository.deleteByCreatedAtBefore(previousYear); 
    } 
+0

當我將它添加到回購它說:'無效的派生查詢!沒有財產deleteTweetstbyCreatedAt發現類型Tweetpost!' – julien

+0

對不起,我犯了一個錯字。現在已經糾正了。 –

+0

沒問題我和你的例子一起工作並解決了這個問題。 – julien

0

計算當前的時間減去在Java的一年然後使用下面的查詢:

DELETE FROM Tweetpost t WHERE t.createdAt < :nowMinusOneYear 
+0

我已經嘗試計算一個newDate - 360天,但它總是給我一個錯誤.. – julien

+0

如果你沒有發佈用於計算它的代碼和你得到的錯誤,我們可能會如何幫助你? –

+0

對不起,這裏是我所擁有的,但是當我嘗試創建新的日期「OneYear」時,有很多語法錯誤... ... \t'Calendar cal = Calendar.getInstance(); \t cal.setTime(dateInstance); \t cal.add(Calendar.DATE,-360); \t Date OneYear = cal.getTime();' – julien

0

如果你想當前的時間,你可以使用

System.getCurrentTimeMillis() 

從舊日期花費時間和從當前減去它,那麼你就必須把它與一年時間進行比較。 也許你應該增加一些閏年。

1

解決:

儲存庫:

@Modifying 
    @Transactional 
    @Query("DELETE FROM Tweetpost m WHERE m.createdAt < :date") 
    int removeOlderThan(@Param("date") java.sql.Date date); 

服務:

public void removeOldItems() { 
     Calendar cal = Calendar.getInstance(); 
     cal.add(Calendar.DATE, -360); 

     java.sql.Date oneYear = new java.sql.Date(cal.getTimeInMillis()); 

     tweetRepository.removeOlderThan(oneYear); 


    }