正确删除JPA中的帖子评论

时间:2018-12-04 12:13:38

标签: java hibernate jpa orm jax-rs

我有一个带有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 :(得分:1)

您错过了查询中的FROM

通过指定DELETE FROM Comment c WHERE c.id = :id将查询更改为此FROM

引用this

答案 1 :(得分:1)

您可以省略条件检查,因为根据getSingleResult()文档,如果没有结果将抛出NoResultException,则可以捕获该异常并重新抛出您的异常。

所以解决方案看起来像这样:

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

还要确保按照外星人的说法将FROM添加到您的JPQL查询中。

编辑: 我认为您应该致电query.executeUpdate()而不是致电getSingleResult();

答案 2 :(得分:1)

  

创建 DELETE或UPDATE 查询时,应始终使用 executeUpdate 方法

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

此方法的返回类型是一个整数,告诉您表中有多少行受到影响