Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQLGrammarException:尝试从数据库中删除时无法执行语句_Java_Spring_Postgresql_Spring Data Jpa - Fatal编程技术网

Java SQLGrammarException:尝试从数据库中删除时无法执行语句

Java SQLGrammarException:尝试从数据库中删除时无法执行语句,java,spring,postgresql,spring-data-jpa,Java,Spring,Postgresql,Spring Data Jpa,我正在尝试解决语句删除查询的问题。现在实现如下所示 @Transactional public void deleteStatements(LocalDate expiryDate) { int deletedStatements = statementRepository.deleteByIdCreatedDateBefore(expiryDate); logger.info("Deleted {} statements.", deletedStatements); }

我正在尝试解决语句删除查询的问题。现在实现如下所示

 @Transactional
public void deleteStatements(LocalDate expiryDate) {
    int deletedStatements = statementRepository.deleteByIdCreatedDateBefore(expiryDate);
    logger.info("Deleted {} statements.", deletedStatements);
}


@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);
@Transactional
公共void delete语句(LocalDate expiryDate){
int deletedStatements=statementRepository.deleteByIdCreatedDateBefore(expiryDate);
info(“删除的{}语句。”,删除的语句);
}
@查询(value=“WITH deleted AS(从创建日期<:expiryDate RETURNING id的生成的\u语句中删除)”+
“从已删除中选择计数(*)”,nativeQuery=true)
int deleteByIdCreatedDateBefore(LocalDate expiryDate);
现在我得到了这个错误:
无法执行语句;SQL[n/a];嵌套异常为org.hibernate.exception.sqlgrammareexception:无法执行语句

我尝试添加@Modifying注释,然后尝试删除它,尝试使用@Transactional和@Modifying的各种组合,但仍然会遇到与此删除相关的各种错误,如:
无法提取结果集;SQL[n/a];嵌套异常为org.hibernate.exception.sqlgrammareexception:无法提取结果集
或执行更新/删除查询;嵌套异常为javax.persistence.TransactionRequiredException:执行更新/删除查询
现在我真的不确定这里有什么问题。

用这个替换删除查询

@Modifying
@Query(value = "DELETE FROM generated_statements WHERE created_date < :expiryDate", nativeQuery = true)
int deleteByIdCreatedDateBefore(LocalDate expiryDate);
修改 @查询(value=“从已创建的\u语句中删除,其中创建的\u日期<:expiryDate”,nativeQuery=true) int deleteByIdCreatedDateBefore(LocalDate expiryDate); 或者直接将其转换为JPQL/HQL查询。不需要nativeQuery。例如:

@Modifying
@Query(value = "DELETE FROM GeneratedStatement g WHERE g.createDate < :expiryDate")
int deleteByIdCreatedDateBefore(LocalDate expiryDate);
修改 @查询(value=“从GeneratedStatement g中删除,其中g.createDate<:expiryDate”) int deleteByIdCreatedDateBefore(LocalDate expiryDate);
通过指定
int
返回值,您将自动获得已删除行数。

考虑到所有这些复杂的逻辑是获取已删除行数,您可以尝试以下操作:

修改 @查询(“从生成的\u语句中删除,其中创建的\u日期<:expiryDate”) int deleteByIdCreatedDateBefore(LocalDate expiryDate); 或者仅使用关键字(如果实体具有createdDate属性)

修改 @查询(value=“从已创建的\u语句中删除,其中创建的\u日期<?1”,nativeQuery=true) int deleteByIdCreatedDateBefore(LocalDate expiryDate);
您为什么需要
CTE
?JDBC会自动返回被删除的行数,我希望像JPA这样的模糊处理层能够返回这些信息。@a_horse_和_no_name抱歉,我不太明白你的意思。那么注释呢,我应该使用哪一个,@modify,@Transational?是的,您需要在查询中添加\@修改,我相应地更新了我的答案。但是:您还需要在\@事务中执行您的方法。通常,您的存储库将从服务方法调用,您将使其成为\@事务性的,但是您也可以使您的存储库方法成为\@事务性的;SQL[n/a];嵌套异常为org.hibernate.exception.sqlgrammareexception:无法提取结果集异常,因为@Modifying无法返回结果集?因为我之前就因为这个原因出现了这个错误。所以我可以在调用statementRepository方法的方法上保留@Transactional注释,就像我的问题中一样,是吗?至于你的第二个问题(\@Transactional),是的。对于第一个:尝试使用\@Query、\@Modify,暂时不使用本机查询。请尝试添加更多详细信息。
int deleteByCreatedDateBefore(LocalDate expiryDate);
@Modifying
@Query(value = "DELETE FROM generated_statements WHERE created_date < ?1", nativeQuery = true)
int deleteByIdCreatedDateBefore(LocalDate expiryDate);