Spring Data @Query для создания MySQL Event - PullRequest
0 голосов
/ 26 февраля 2019

Я хочу создать событие 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 ...?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

delimiter

- это команда

.. mysql (инструмент CLI) ...

(.. и только "взломать", чтобы "деактивировать нормальную функцию ;" в mysql (инструмент CLI).)

.. это не команда SQL!(и, конечно, выдает ошибку SQL: 1064 ...)

В вашем случае ( Вам вообще не нужно delimiter ), вы можете просто использовать точки с запятой и BEGIN, DECLARE, END, ... "по необходимости" и "полагаться" на возможности драйвера.

->

Если я изменю запросбез разделителя и с двумя операторами обновления в теле он тоже работает


Другая проблема:

, но транзакция зафиксирована перед методом testEndEvent ().

... У нас мало информации, но, согласно вашему коду, может быть таким:

Вызов метода Spring @Transaction для метода внутритот же класс, не работает?

0 голосов
/ 27 февраля 2019

Чаще всего ошибка возникает на SQL Error: 1064, когда мы используем зарезервированные слова в нашем определении sql.Попробуйте изменить имя на параметр de date.Я надеюсь, что это может быть полезно для вас

...