gpt4 book ai didi

java - 如何在 JpaRepository 上运行自定义更新查询?(TransactionRequiredException)

转载 作者:行者123 更新时间:2023-12-02 09:31:37 27 4
gpt4 key购买 nike

我正在尝试在 spring 中编写 2 个 native SQL 查询,

我在服务类中使用 SQL 的查询注释是:

    @Transactional
@Scheduled(cron = "0 0/1 * * * *")
void testMethod() {

String query = "UPDATE BUDGET_GROUP_SPEND_SUMMARY BSS, USER U, EMPLOYEE_MOVE_STAGE EMS, BUDGET B, SERVICE_GROUP SG " +
"SET BSS.BULK_RECALC_LOCK = true " +
"WHERE BSS.EMPLOYEE_ID = U.USER_ID " +
"AND U.USER_ID = EMS.USER_ID " +
"AND BSS.BUDGET_GROUP_ID = B.BUDGET_ID " +
"AND B.BUDGET_SERVICE_GROUP_ID IS NOT NULL " +
"AND EMS.MOVE_STAGE_ID IN (1,2) " +
"AND U.USER_CUSTOMER_STATUS IN ('MOVE_COMPLETED', 'LOST', 'GET_FEEDBACK', 'CLOSED_NO_FEEDBACK', 'ON_ASSIGNMENT') " +
"AND B.BUDGET_SERVICE_GROUP_ID = SG.SERVICE_GROUP_ID " +
"AND SG.MOVE_STAGE_ID = 1";

Query nq = entityManager.createNativeQuery(query);

nq.executeUpdate();
}

但是我收到了这个错误:

2019-09-12 18:28:00,012 ERROR [] o.s.s.s.TaskUtils$LoggingErrorHandler:95 - Unexpected error occurred in scheduled task.
javax.persistence.TransactionRequiredException: Executing an update/delete query
at org.hibernate.jpa.spi.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:54)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

如果我使用entityManager.getTransaction().begin();entityManager.getTransaction().commit();

然后是抛出:

2019-09-12 18:36:00,007 ERROR [] o.s.s.s.TaskUtils$LoggingErrorHandler:95 - Unexpected error occurred in scheduled task. java.lang.IllegalStateException: Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManager

为什么我会收到此错误?

或者还有其他更好的方法来使用Jpa Repository实现自定义更新查询吗?

最佳答案

  1. 我假设Spring不会创建事务代理,因为您的方法不是公共(public)
  2. 如果您使用声明式 Spring 事务管理器,您应该始终尝试避免手动事务管理
  3. 您的应用程序应该有一个处理数据库调用的单独层。在您的例子中,它是 JPA 存储库。因此,最好在自定义 Jpa 存储库中实现查询,在此处注入(inject)其实例并调用适当的方法。

关于java - 如何在 JpaRepository 上运行自定义更新查询?(TransactionRequiredException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57910226/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com