Правильное удаление комментариев к сообщению в JPA - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть внешнее приложение с бэкэндом JPA / JAX-RS, где я хочу сделать запрос на удаление комментария к сообщению.

Я использую шаблон репозитория, где я сделал следующий метод для удаления комментария:

@Override
public Comment delete(Comment comment)
{
return getEntityManager().createQuery("DELETE Comment c WHERE c.id = :id ", Comment.class)
        .setParameter("id", comment.getId())
        .getSingleResult();
}

здесь я получаю ошибку:

Update/delete queries cannot be typed JPA

Здесь я немного сомневаюсь, что делать, я мог бы просто изменить класс Comment.class и сделать его общим запросом, но внутри моего фасада, который вызывает метод

, я также хочу сделать условное выражениепроверить, был ли комментарий или нет

 Comment commentToDelete = commentRepository.get(comment);
        if(commentToDelete == null){
            throw new ResourceNotFoundException(Comment.class, comment);
        }

как я могу решить эту проблему самым простым способом, я могу вернуть объект и просто привести его, или есть другой способ проверить комментарий и удалитьэто из базы данных?

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Вы можете опустить условную проверку, потому что согласно документации getSingleResult () , если нет результата, она выдаст NoResultException, вы можете просто перехватить это исключение и повторно выдать свое.

Таким образом, решение будет выглядеть примерно так:

try {
    Comment deletedComment = commentRepository.delete(comment);
} catch (NoResultException nre) {
    throw new ResourceNotFoundException(Comment.class, comment)
}

Также обязательно добавьте FROM к вашему запросу JPQL, как сказал Alien.

Редактировать: Я думаю, что выследует позвонить query.executeUpdate() вместо вызова getSingleResult();

0 голосов
/ 04 декабря 2018

Когда вы создаете запрос DELETE OR UPDATE , вы всегда должны использовать executeUpdate method

getEntityManager().createQuery("DELETE FROM Comment c WHERE c.id = :id ", Comment.class)
        .setParameter("id", comment.getId())
        .executeUpdate();

Returnтип этого метода - целое число, указывающее, сколько строк в вашей таблице было затронуто

0 голосов
/ 04 декабря 2018

Вы пропустили FROM в запросе.

Измените запрос на этот DELETE FROM Comment c WHERE c.id = :id, указав FROM

См. это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...