虽然JPA自带了一些常用的数据库操作api
但是使用过程中难免会需要我们自定义一些查询
比如我们需要根据评论人的名字查询它的所有评论
显然需要我们自己来写自己的查询
@Query(nativeQuery = true,value = "select * from t_comment where comment_people = ?1")
List<Comment> getCommentsByCommentPeopleName(String comment_people);
然后对应写上Service和Controller,Postman进行测试
成功根据传入的姓名查询到了对应的所有评论
如果我们需要对数据库数据进行修改/删除呢?
直接像这样修改SQL语句就可以了吗?
不妨测试一下,
发现报错了
问题其实也很好理解
JPA默认使用了executeQuery()去执行了上面自定义的SQL,而我们自定义的SQL是一个delete语句,应该使用execute()去执行
因此会造成数据库报错
如何去修改呢?
只需要在方法前面加上@Modifying
即可,告诉JPA这是一个UPDATE或者DELETE语句
然而发现还是报错了
进过查询发现,这是因为JPA对数据操作的硬性要求导致的
没有事务的支持,不允许执行更新和删除的操作
所以我们需要注明,这是一个事务,即以下方法二选一
- 直接在Dao层方法上注明
@Transactional
- 在Service层的实现类上加上
@Transactional
在Service层上添加
直接在方法上添加
以上两种方法都可以解决我们的问题
参考:
JPA事务问题Executing an update/delete query
JPA报错Can not issue data manipulation statements with executeQuery().