【问题标题】:Delete records from more than 1 year ago删除超过 1 年以前的记录
【发布时间】:2016-06-03 15:58:25
【问题描述】:

我正在使用 spring JPA Repositories 将 Twitter 推文保存在我的数据库中。推文的日期在 MySQL 数据库中保存为 Datetime。现在我想删除所有超过一年的推文。我看到有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);


    }

【问题讨论】:

  • WHEREt.createdAt &lt; CURDATE() - INTERVAL 1 YEAR
  • 那么为什么这个标签是mysql?
  • 因为它的 mysql 数据库在后台工作。
  • 但是你不能将原始(my)sql传递给它?
  • 不使用 Spring JPA Data,当我使用“Interval”时会引发异常。

标签: java mysql spring jpa


【解决方案1】:

为此,您需要 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);
     }

【讨论】:

  • 当我将它添加到回购时,它说:Invalid derived query! No property deleteTweetstbyCreatedAt found for type Tweetpost!
  • 没问题,我使用您的示例并解决了问题。
  • 感谢春天的数据,祝你好运:)
【解决方案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);


    }

【讨论】:

    【解决方案3】:

    用 Java 计算当前时间减去一年,然后使用以下查询:

    DELETE FROM Tweetpost t WHERE t.createdAt < :nowMinusOneYear
    

    【讨论】:

    • 我已经尝试计算一个 newDate - 360 天,但它总是给我一个错误..
    • 如果您不发布用于计算它的代码以及您遇到的错误,我们怎么能帮助您?
    • 是的,对不起,这是我所拥有的,但是当我尝试创建新日期“OneYear”时出现很多语法错误...Calendar cal = Calendar.getInstance(); cal.setTime(dateInstance); cal.add(Calendar.DATE, -360); Date OneYear = cal.getTime();
    • 在问题中发布,并告诉错误是什么。
    • 我做了有没有可能,我不能在存储库中创建新的日期?
    【解决方案4】:

    如果你想要当前时间,你可以使用

    System.getCurrentTimeMillis()
    

    从旧日期中取出时间并从当前日期中减去它,然后您只需将其与一年的持续时间进行比较。 也许你应该为闰年添加一些东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-27
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 2021-04-24
      • 2012-06-30
      • 2013-09-30
      相关资源
      最近更新 更多