在 JPA 中正确删除对 Post 的评论

Properly deleting comments on a Post in JPA

我有一个带有 JPA/JAX-RS 后端的前端应用程序,我想在其中请求删除对 post 的评论。

我正在使用存储库模式,其中我使用以下方法删除评论:

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

我怎样才能以最简单的方式解决这个问题,我可以 return 一个对象然后直接转换它,还是有另一种方法来检查评论并将其从数据库中删除?

您在查询中错过了 FROM

通过指定 FROM

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

参考

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

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

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

同时确保将 FROM 添加到您的 JPQL 查询中,正如 Alien 所说。

编辑: 我认为你应该调用 query.executeUpdate() 而不是调用 getSingleResult();

When you create a DELETE OR UPDATE query, you should always use executeUpdate method

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

The return type of this method is an integer telling you how many rows within your table have been affected