我想在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事件...?
答案 0 :(得分:0)
最常见的错误发生在SQL Error: 1064
上是当我们在sql定义中使用保留字时。尝试将名称更改为de date
参数。希望对您有用
答案 1 :(得分:0)
delimiter
是
different installation & configuration(CLI工具)的.. command ...
(..并且只有一个“ hack”来“停用mysql(CLI工具)中的;
的正常功能。)
..它不是SQL命令! (当然会抛出SQL错误:1064 ...)
以您为例(您根本不需要delimiter
),您可以只使用分号和BEGIN
,DECLARE
,{{1 }},...“根据需要”和“依赖”驱动程序的功能。
->
如果我更改查询,不使用分隔符并且在主体中具有两个update语句,那么它也可以工作
但是在方法testEndEvent()之前提交了事务。
...我们的信息很少,但是根据您的代码,可以是这样的: