Spring Data @Query创建MySQL事件

时间:2019-02-26 11:08:00

标签: java hibernate spring-data-jpa spring-data

我想在Spring数据中使用Query Method(@Query)以编程方式创建MySQL Event。我的代码是这样的:

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);

但是我得到这样的错误:

  

o.h.engine.jdbc.spi.SqlExceptionHelper:SQL错误:1064,SQLState:42000   o.h.engine.jdbc.spi.SqlExceptionHelper:SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以在'DELIMITER |附近使用正确的语法。   在第1行的'2019-02-27 05:20:0'创建事件test_open开启时间表   例如:org.springframework.dao.InvalidDataAccessResourceUsageException:无法执行语句; SQL [n / a];嵌套的异常是org.hibernate.exception.SQLGrammarException:无法执行语句

我调用saveAndCreateEvent()方法来保存测试详细信息并在MySQL中创建start_event和end_event。 问题发生在调用createEventTestOpen()的方法testStartEvent()中。

我猜想是因为DELIMITER |。 如果我更改查询,但没有delimiter并且正文中只有一个update语句(第一个),它将很好地工作。

已更新2019年2月27日:此方法无法正常工作。此查询还会立即导致提交事务。

@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并且在正文中有两个update语句,它也可以工作,但是在方法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。

如何在Spring中使用查询方法使用分隔符创建MySQL事件...?

2 个答案:

答案 0 :(得分:0)

最常见的错误发生在SQL Error: 1064上是当我们在sql定义中使用保留字时。尝试将名称更改为de date参数。希望对您有用

答案 1 :(得分:0)

delimiter

  different installation & configuration(CLI工具)的

.. command ...

(..并且只有一个“ hack”来“停用mysql(CLI工具)中的;的正常功能。)

..它不是SQL命令! (当然会抛出SQL错误:1064 ...)

以您为例(您根本不需要delimiter ),您可以只使用分号和BEGINDECLARE,{{1 }},...“根据需要”和“依赖”驱动程序的功能。

->

  

如果我更改查询,不使用分隔符并且在主体中具有两个update语句,那么它也可以工作


另一个问题:

  

但是在方法testEndEvent()之前提交了事务。

...我们的信息很少,但是根据您的代码,可以是这样的:

mysql