Я пишу школьный проект, где люди могут купить билеты в кино. Я хочу иметь возможность отправлять пользователям бесплатные билеты в кино на определенные случаи, которые действительны только в течение определенного дня. В полночь я запускаю задание CRON, в результате которого билеты становятся неактивными, если срок их действия истек, поэтому их больше нельзя использовать. У меня странное поведение с запросом деактивации, и я не понимаю, почему.
У меня есть этот JPA Repository
:
public interface UserTicketRepo extends JpaRepository<UserTicket, Long> {
@Query(value = "update UserTicket ut\n" +
"set isvalid = 0\n" +
"where id in (\n" +
" select ticketId\n" +
" from (\n" +
" select ut.id as ticketId\n" +
" from UserTicket ut\n" +
" inner join TicketPrice tp on ut.ticketPrice_id = tp.id\n" +
" inner join PurchaseItem pi on ut.purchaseItemId = pi.id\n" +
" inner join Purchase p on pi.purchaseId = p.id\n" +
" where ut.isvalid = 1\n" +
" and tp.id = '" + TicketPrice.FREE_TICKET_ID + "'\n" +
" and TIMESTAMPDIFF(SECOND, NOW(), DATE_ADD(p.added, INTERVAL ut.activationPeriod SECOND)) < 0) as t\n" +
");", nativeQuery = true)
@Modifying(clearAutomatically = true, flushAutomatically = true)
@Transactional
void deactivateAllUserTicketsThatAreOverTheValidityEnd();
}
Когда я выполняю этот точный запрос вручную в инструменте БД, все мои данные обновляются корректно, но когда я запускаю запрос с использованием метода, описанного в приведенном выше коде, он не обновляет пользовательские билеты, срок действия которых истек вчера, по неизвестной причине.
Edit:
После еще одного исследования я нашел этот пост: JPQL Query и Native Query, возвращающие разные результаты в spring-data-jpa
Похоже, что в нативных запросах с датами происходит какая-то странность. Может быть, это причина, почему у меня проблемы. Я буду держать вас в курсе, если узнаю больше.