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();
반응형