SQLGrammarException: не удалось выполнить инструкцию при попытке удалить из БД - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь решить проблему с запросом удаления оператора. Теперь реализация выглядит следующим образом.

 @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);

Теперь я получаю эту ошибку: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement

Я пытался добавить аннотацию @Modifying, затем я пытался удалить ее, пробовал с различными комбинациями из @Transactional и @Modifying, все еще есть различные ошибки, связанные с этим удалением, такие как: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet или Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query Теперь я действительно не уверен, в чем здесь проблема.

Ответы [ 3 ]

0 голосов
/ 06 апреля 2020

Учитывая все эти сложные логи c, чтобы получить количество удаленных строк, которые вы можете попробовать просто:

@Modifying
@Query("DELETE FROM generated_statements WHERE created_date < :expiryDate")
int deleteByIdCreatedDateBefore(LocalDate expiryDate);

или просто используя ключевые слова (если ваша сущность имеет атрибут createDate)

int deleteByCreatedDateBefore(LocalDate expiryDate);
0 голосов
/ 03 мая 2020
@Modifying
@Query(value = "DELETE FROM generated_statements WHERE created_date < ?1", nativeQuery = true)
int deleteByIdCreatedDateBefore(LocalDate expiryDate);
0 голосов
/ 06 апреля 2020

Замените ваш запрос на удаление этим

@Modifying
@Query(value = "DELETE FROM generated_statements WHERE created_date < :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);

Указав возвращаемое значение int, вы автоматически получите количество удаленных строк.

...