当前位置: 首页 > 知识库问答 >
问题:

Spring Data@Query创建MySQL事件

韩淇
2023-03-14

我想用spring数据中的查询方法(@Query)以编程方式创建MySQL事件。我的代码是这样的:

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());
};
@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);

我想这是因为delimiter。如果更改query,没有delimiter,并且在body中只有一个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事件...?

共有1个答案

冯奇思
2023-03-14

sql error:1064上最常见的错误是在sql定义中使用保留字。尝试将名称更改为dedate参数。我希望这能对你有用

 类似资料:
  • 以下示例将演示如何在DBUtils的帮助下使用Insert查询创建记录。 我们将在Employees Table中插入一条记录。 语法 (Syntax) String insertQuery ="INSERT INTO employees(id,age,first,last) VALUES (?,?,?,?)"; int insertedRecords = queryRunner.update(

  • 问题内容: 是否可以使用Spring Data创建只读存储库? 我有一些链接到视图的实体,还有一些子实体,我想为其提供一个存储库,其中包含的某些方法,以及带有批注的某些方法。我想避免提供像和这样的方法,因为它们没有意义,并且可能会产生错误。 谢谢! 问题答案: 是的,方法是添加手工制作的基础存储库。您通常使用以下内容: 现在,您可以使刚刚定义的具体回购扩展: 定义基本存储库的关键部分是,方法声明

  • 我已经成功订阅了我的iCal日历,我可以查看事件,它已经更新。但是,如果我查看单个事件,我无法创建警报或提醒。通常有一个编辑按钮,用于从交换的普通日历加载的任何日历事件。 我想我在某处听说,您可能必须使用web dav服务器为某个特定事件执行提醒或警报。这是真的吗?或者有人有幸得到提醒来工作吗。 下面是php生成的ics文件。 谢谢巴特

  • 问题内容: 我有一个现有的产品变型方案。 我想创建每个生产时间,数量和变化选项的组合。 我将通过访问产品的数量,生产时间,差异和差异选项来创建选择表单。 table_groups table_days table_quantities table_attributes table_attribute_values 我准备了一个示例架构。但是,我没有得到想要的结果。 SQL小提琴 我做了很多事情:

  • 我们不仅可以分配事件处理程序,还可以从 JavaScript 生成事件。 自定义事件可用于创建“图形组件”。例如,我们自己的基于 JavaScript 的菜单的根元素可能会触发 open(打开菜单),select(有一项被选中)等事件来告诉菜单发生了什么。另一个代码可能会监听事件,并观察菜单发生了什么。 我们不仅可以生成出于自身目的而创建的全新事件,还可以生成例如 click 和 mousedow

  • 主要内容:1. 使用CREATE USER语句创建用户,2. 使用 INSERT 语句新建用户,3. 使用GRANT语句新建用户MySQL 在安装时,会默认创建一个名为 root 的用户,该用户拥有超级权限,可以控制整个 MySQL 服务器。 在对 MySQL 的日常管理和操作中,为了避免有人恶意使用 root 用户控制数据库,我们通常创建一些具有适当权限的用户,尽可能地不用或少用 root 用户登录系统,以此来确保数据的安全访问。 MySQL 提供了以下 3 种方法创建用户。 使用 CREAT