2016-02-22 144 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); 


    }