首页 > 解决方案 > Spring Boot:如何从@scheduled cron 方法内部运行更新查询?

问题描述

我有一个名为“docket_seq”的表,只有 1 列“next_val”。我需要每天在特定时间重置 next_val 的值。我写的更新查询如下:

package com.xxx.xxx.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import com.xxx.xxx.model.DocketSequence;

@Repository
public interface DocketSequenceRepository extends JpaRepository<DocketSequence, Long> {
    @Modifying
    @Query("UPDATE DocketSequence SET next_val='1'")
    Long resetDateSequence(@Param("next_val") Long next_val);       
}

我正在运行 cron 作业,如下所示:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.xxx.xxx.model.DocketSequence;
import com.xxx.xxx.repository.DocketSequenceRepository;

@Component
public class ResetDocketSequence {
    @Autowired
    DocketSequenceRepository docketSequenceRepository;

    DocketSequence docketSequence; 

    @Scheduled(cron = "0 06 23 * * ?", zone = "Asia/Calcutta")
    public void resetSequence() {   
        docketSequenceRepository.save(docketSequence);
        System.out.println("Cron job has run");      
     }
}

当我执行代码并且 cron 作业运行时,我收到错误:InvalidDataAccessApiUsageException:目标对象不能为空。我已经尝试了很多东西,但我认为会有一种简单的方法来更新表中列的值。

标签: spring-bootcronspring-data-jpa

解决方案


NOT NULL您的数据库中的列似乎有一个约束。因此,您不能保存空值。

cron 作业开始时为 null ,DocketSequence docketSequence;因为没有初始化。

为您定义一个默认值DocketSequence以更新数据库中的值。另一种选择是允许您的列使用空值。


推荐阅读