postgresql中带有spring数据jpa的SQLGrammarException和TransactionRequ



我正在用java实现从postgresqldb表逻辑中删除语句。但我总是犯各种各样的错误。

一般来说,我的查询是这样的。

@Modifying
@Query(value = "WITH deleted AS (DELETE FROM generated_statements WHERE created_date < :expiryDate RETURNING id) " +
"SELECT count(*) FROM deleted;", nativeQuery = true)
int deleteByIdCreatedDateBefore(LocalDate expiryDate);

但我得到了Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query

如果我删除@Modifying注释,我得到:could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet

我认为问题出在不正确的注释上。我应该添加@Transactional吗?我应该如何处理当前的注释?

您需要添加@Transactional annotation,这样spring/jpa将为您处理一些事情:这是打开一个新事务,运行sql查询,并提交此事务。

这需要克服在以任何方式更新/删除/修改数据时损坏数据的潜在问题。

正如错误消息所说:您需要一个事务。因此添加@Transactional

正如另一条错误消息所说:@Modifying无法返回ResultSet。因此,删除@Modifying,尽管这是违反直觉的。

现在我仍然不确定这是否有效,但如果不起作用,你就根本无法使用@Query,应该依靠基于注入的JdbcTemplateEntityManager的自定义方法实现。

相关内容

  • 没有找到相关文章

最新更新