복붙노트

[SPRING] 1 년 이상 된 레코드 삭제

SPRING

1 년 이상 된 레코드 삭제

Spring JPA Repositories를 사용하여 데이터베이스에 트위터를 저장하고 있습니다. 트윗의 날짜는 Datetime으로 MySQL 데이터베이스에 저장됩니다. 이제 1 년이 넘은 모든 트윗을 삭제하고 싶습니다. 함수 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);


    }

해결법

  1. ==============================

    1.이를 위해서는 2 단계가 필요합니다. 무엇보다도 매개 변수로 메시지를 삭제할 날짜를 취하는 메서드가 필요하며 @Query 주석을 전혀 필요로하지 않습니다.

    이를 위해서는 2 단계가 필요합니다. 무엇보다도 매개 변수로 메시지를 삭제할 날짜를 취하는 메서드가 필요하며 @Query 주석을 전혀 필요로하지 않습니다.

    따라서 저장소에 다음과 같은 것이 있어야합니다.

        @Modifying
        public void deleteByCreatedAtBefore(Date expiryDate);
    

    이제 서비스 메소드에서 Date를 계산하고 이것을 다음과 같이 전달할 것입니다.

        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);
         }
    
  2. ==============================

    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. ==============================

    3.Java에서 현재 시간 - 1 년을 계산 한 후 다음 쿼리를 사용합니다.

    Java에서 현재 시간 - 1 년을 계산 한 후 다음 쿼리를 사용합니다.

    DELETE FROM Tweetpost t WHERE t.createdAt < :nowMinusOneYear
    
  4. ==============================

    4.현재 시간을 원하면

    현재 시간을 원하면

    System.getCurrentTimeMillis()
    

    이전 날짜에서 시간을 가져 와서 현재 날짜에서 빼면 1 년 기간과 비교하면됩니다. 어쩌면 당신은 윤년에 뭔가를 추가해야 할 것입니다.

  5. from https://stackoverflow.com/questions/35550019/delete-records-from-more-than-1-year-ago by cc-by-sa and MIT license