我正在用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
,应该依靠基于注入的JdbcTemplate
或EntityManager
的自定义方法实现。