Я хочу создать событие MySQL программно с помощью метода запроса (@Query) в весенних данных.И мой код выглядит так:
TestService.java
@Transactional(propagation=Propagation.REQUIRED)
public void saveAndCreateEvent(Test test) {
save(test);
testStartEvent(test);
testEndEvent(test);
}
@Transactional(propagation=Propagation.REQUIRED)
public void save(Test test){
testRepository.save(test);
}
@Transactional(propagation=Propagation.REQUIRED)
public void testStartEvent(Test test){
byte statusId = 2;//Open
testRepository.createEventTestOpen(test.getId(), statusId, test.getStartDate());
};
TestRepository.java
@Query(value="DELIMITER |"
+ " CREATE EVENT test_open"
+ " ON SCHEDULE AT :date"
+ " DO"
+ " BEGIN"
+ " UPDATE `test`"
+ " SET `test_status_id` = :statusId"
+ " WHERE `id` = :id ;"
+ " UPDATE `user`"
+ " SET ...
+ " WHERE `id` = (SELECT `user_id` FROM `test_participant` WHERE `test_id` = :id);"
+ " END |"
+ " DELIMITER ;", nativeQuery=true)
public void createEventTestOpen(
@Param("id") Long id,
@Param("statusId") byte statusId,
@Param("date") Date date);
Но я получаю ошибку, как это:
ohengine.jdbc.spi.SqlExceptionHelper: ошибка SQL: 1064, SQLState: 42000 ohengine.jdbc.spi.SqlExceptionHelper: в синтаксисе SQL имеется ошибка;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с «DELIMITER |СОЗДАТЬ СОБЫТИЕ test_open ON SCHEDULE AT '2019-02-27 05: 20: 0' в строке 1 Ex: org.springframework.dao.InvalidDataAccessResourceUsageException: не удалось выполнить оператор;SQL [н / п];Вложенное исключение - org.hibernate.exception.SQLGrammarException: не удалось выполнить инструкцию
Я вызываю метод saveAndCreateEvent () для сохранения подробностей теста и создания start_event и end_event в MySQL.Проблема возникла в методе testStartEvent (), который вызывает createEventTestOpen ().
Я полагаю, это происходит из-за DELIMITER |
.Если я изменю запрос без delimiter
и только одного оператора обновления в теле (первый), он будет работать нормально.
ОБНОВЛЕНО 27 февраля 2019 : Этот метод не работает нормально.Этот запрос также немедленно вызывает транзакцию фиксации.
@Query(value="CREATE EVENT test_open"
+ " ON SCHEDULE AT :date"
+ " DO"
+ " UPDATE `test`"
+ " SET `test_status_id` = :statusId"
+ " WHERE `id` = :id ;", nativeQuery=true)
public void createEventTestOpen(
@Param("id") Long id,
@Param("statusId") byte statusId,
@Param("date") Date date);
Если я изменяю запрос, без delimiter
и с двумя операторами обновления в теле он тоже работает, но транзакция фиксируется перед методом testEndEvent ().
@Query(value="CREATE EVENT test_open"
+ " ON SCHEDULE AT :date"
+ " DO"
+ " BEGIN"
+ " UPDATE `test`"
+ " SET `test_status_id` = :statusId"
+ " WHERE `id` = :id ;"
+ " UPDATE `user`"
+ " SET ...
+ " WHERE `id` = (SELECT `user_id` FROM `test_participant` WHERE `test_id` = :id);"
+ " END", nativeQuery=true)
public void createEventTestOpen(
@Param("id") Long id,
@Param("statusId") byte statusId,
@Param("date") Date date);
Я использую spring-boot-starter-parent версии 1.5.13.RELEASE.
Как создать событие MySQL с разделителем, используя метод запроса в Spring ...?