我有一个带有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);
}
我该如何以最简单的方式解决此问题,我可以返回一个对象并将其强制转换,还是有另一种方法来检查注释并将其从数据库中删除?
答案 0 :(得分:1)
答案 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();
此方法的返回类型是一个整数,告诉您表中有多少行受到影响