프로젝트 진행 중 사용자가 생성한 유효한 티켓을 일괄적으로 만료시켜줄 필요가 있었다.
업데이트가 필요한 필드 중에 티켓의 생성 시각과 종료 시각의 유닉스 시간을 뺀 값을 기록하는 필드가 있었기 때문에 기존에 JPQL 만으로 해결하기에는 문제가 있었다.
Spring Data JPA에서 네이티브 SQL을 사용하기 위해서는 기존의 @Query 애노테이션을 nativeQuery = true 로 설정해주기만 하면 된다. 이때 테이블의 컬럼명과 동일한 이름을 사용하는 것에 주의하여야 한다.
@Modifying
@Query(value = "update Ticket t" +
" set t.ticket_status='END'," +
" t.end_time=:endTime," +
" t.active_time=:endTimeToSecond-datediff('second', '1970-01-01 09:00:00', t.start_time)" +
" where t.ticket_status != 'END'", nativeQuery = true)
int updateTicketStatusToEnd(@Param("endTime") LocalDateTime endTime,
@Param("endTimeToSecond") long endTimeToSecond);
위 코드에서는 H2 데이터베이스의 함수인 datediff()를 이용해서 티켓의 생성 시각을 초로 변환한 뒤 연산에 이용하고 있다. 이처럼 데이터베이스의 내장 함수를 사용할 수 있다는 장점이 있으나 해당 DB에 의존적이게 되기 때문에 추후 DB를 변경하는 것에 유의하여야 한다.
'JPA' 카테고리의 다른 글
일대다 페이지네이션 최적화하기 (0) | 2023.12.13 |
---|---|
엔티티 매니저와 영속성 컨텍스트 (0) | 2023.07.30 |
JdbcTemplate batchUpdate()를 이용한 Batch insert (0) | 2023.04.24 |
[querydsl] in절 동적 쿼리 작성 주의점(1=2) (0) | 2023.04.03 |