본문 바로가기
JPA

JPA에서 네이티브 SQL 사용하기

by hseong 2023. 3. 6.

프로젝트 진행 중 사용자가 생성한 유효한 티켓을 일괄적으로 만료시켜줄 필요가 있었다.

업데이트가 필요한 필드 중에 티켓의 생성 시각과 종료 시각의 유닉스 시간을 뺀 값을 기록하는 필드가 있었기 때문에 기존에 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를 변경하는 것에 유의하여야 한다.