Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

요리사에서 IT개발자로

SQL 쿼리 delete메소드 작동에 대해 본문

Spring

SQL 쿼리 delete메소드 작동에 대해

H.S-Backend 2024. 6. 25. 20:51
void deleteTop1ByUserIdOrderByCreatedAtAsc(Long userId);
DELETE FROM your_table
WHERE id = (
    SELECT id FROM your_table
WHERE user_id = ?
ORDER BY created_at DESC
LIMIT 1
    );

 

위에 주어진 SQL 쿼리 메소드는

주어진 사용자에 대해

생성 날짜 기준으로 오름차순으로 정렬된 상위레코드를 삭제하는 쿼리메소드 이다.

 

// 가장 오래된 비밀번호 기록 삭제
if (userPasswordRecordList.size() >= 3) {
    userPasswordRepository.deleteByUserIdOrderByCreatedAtAsc(userDetails.getUserId());
}

그러나 일부 데이터베이스에서

Delete 문 내에 서브쿼리를 직접 실행 하는 것이

불가능 할 수 있다.


해결하는 방법

 먼저 삭제할 객체를 찾아온 후

삭제 명령 delete()안의 넣어주는 방법을 이용하여 

// 가장 오래된 비밀번호 기록 삭제
if (userPasswordRecordList.size() >= 3) {
    UserPasswordRecord oldPassword = userPasswordRepository.findByUserIdAndCreatedAt(userDetails.getUserId(),
       userPasswordRecordList.get(2).getCreatedAt());
    user.removePasswordRecord(oldPassword);
}

위와 같은 구문으로 직접 찾아와서

oldPassword로 해당 객체를 전달해준 뒤에

직접 삭제하는것이

더욱 직관적이며 코드자체로도 명시가 되어있기에 

delete 쿼리로  실행하는것보다 안전하다고 볼 수 있다.

 


아직 배우지는 않았지만

@Query를 사용하여 직접 하드코딩 하므로 삭제가 가능하게 가능도 하다고 한다.

@Query(value = "DELETE FROM my_entity WHERE id = (" +
    "SELECT id FROM my_entity ORDER BY created_at DESC LIMIT 1 OFFSET 2" +
    ")", nativeQuery = true)
void deleteOldestIfMoreThanThree();

 

반응형