虽然JPA自带了一些常用的数据库操作api
    但是使用过程中难免会需要我们自定义一些查询

    比如我们需要根据评论人的名字查询它的所有评论
    显然需要我们自己来写自己的查询

    1. @Query(nativeQuery = true,value = "select * from t_comment where comment_people = ?1")
    2. List<Comment> getCommentsByCommentPeopleName(String comment_people);

    image.png

    然后对应写上Service和Controller,Postman进行测试
    image.png
    成功根据传入的姓名查询到了对应的所有评论
    image.png

    如果我们需要对数据库数据进行修改/删除呢?

    直接像这样修改SQL语句就可以了吗
    image.png

    不妨测试一下,
    发现报错了
    image.png

    问题其实也很好理解

    JPA默认使用了executeQuery()去执行了上面自定义的SQL,而我们自定义的SQL是一个delete语句,应该使用execute()去执行
    因此会造成数据库报错

    如何去修改呢?
    只需要在方法前面加上@Modifying即可,告诉JPA这是一个UPDATE或者DELETE语句

    然而发现还是报错了
    image.png

    进过查询发现,这是因为JPA对数据操作的硬性要求导致的

    没有事务的支持,不允许执行更新和删除的操作

    所以我们需要注明,这是一个事务,即以下方法二选一

    1. 直接在Dao层方法上注明@Transactional
    2. 在Service层的实现类上加上@Transactional

    在Service层上添加
    image.png

    直接在方法上添加
    image.png

    以上两种方法都可以解决我们的问题
    image.png

    参考:
    JPA事务问题Executing an update/delete query
    JPA报错Can not issue data manipulation statements with executeQuery().