我正在使用spring JPA Repositories在我的数据库中保存Twitter推文。推文的日期在MySQL数据库中保存为日期时间。现在我要删除所有超过一年的推文。我看到函数CURRENT_TIME
,我想到了CURRENT_TIME - 360
之类的东西。我知道这不是正确的语法,但我不知道如何做到这一点。这就是我所拥有的:
@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 :(得分:6)
为此您需要2个步骤。首先,您需要一个方法,将您要删除消息的日期作为参数,并且根本不需要@Query
注释。
因此,在您的存储库中,您必须拥有类似
的内容 @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);
}
答案 1 :(得分:2)
<强>解决:强>
存储库:
@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);
}
答案 2 :(得分:1)
在Java中计算当前时间减去一年,然后使用以下查询:
DELETE FROM Tweetpost t WHERE t.createdAt < :nowMinusOneYear
答案 3 :(得分:0)
如果您想要当前时间,可以使用
System.getCurrentTimeMillis()
从旧日期开始计算时间并从当前日期中减去时间,然后您只需将其与一年的持续时间进行比较。 也许你应该为闰年添加一些东西。