JPA使用@Query注解实现update
在做项目中,遇到的用JPA更新数据库问题
用jpa中的save()方法,更新全部字段时会正常实现,可是在只更新部分字段时,会发现没有更新的字段被置为null。
可以通过使用@Query注解来解决。
HQL语句
1 2 3 4 5 6 7 8 9
| import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.transaction.annotation.Transactional;
@Modifying @Transactional @Query(value = "update MedicalSteelPlate msp set msp.shelfNumber= :shelfNumber, msp.type= :type where msp.id= :id") void updateEdit(@Param("id") Integer id, @Param("shelfNumber") String shelfNumber, @Param("type") String type);
|
@Query
注解查询适用于所查询的数据无法通过关键字查询得到结果的查询。这种查询可以摆脱像关键字查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是Spring Data的特有实现。
@Modifying
注解代表允许修改,在@Query注解中实现DELETE和UPDATE操作的时候必须加上该注解,以通知Spring Data 这是一个DELETE或UPDATE操作。
@Transactional
注解用于提交事务。
原生SQL语句
1 2 3 4
| @Modifying @Transactional @Query(value = "update tb_medicalsteelplate msp set msp.shelf_number=?2, msp.type=?3 where msp.id=?1", nativeQuery = true) void updateEdit(Integer id, String shelfNumber, String type);
|
nativeQuery = true
即为本地查询,就是使用原生的 sql 语句进行查询数据库的操作。但是在 Query 中原生态查询默认是关闭的,需要手动设置为true
若没有nativeQuery = true
,select * from xxx 中的xxx就不是数据库中对应的真正的表名而是对应的实体名。
1 2 3 4
| @Entity @Table(name = "tb_medicalsteelplate") public class MedicalSteelPlate //MedicalSteelPlate 为实体名,真正的数据库表名为tb_medicalsteelplate
|
即可以修改为
1 2 3 4
| @Modifying @Transactional @Query(value = "update MedicalSteelPlate msp set msp.shelfNumber=?2, msp.type=?3 where msp.id=?1") void updateEdit(Integer id, String shelfNumber, String type);
|
看自己博客的时候发现,博客上的排版和Markdown预览的排版不一样。
寻找原因,最后发现是因为hexo的Markdown渲染引擎的原因。
这篇博客就是因为单行代码用```包起来,所以导致了格式错误。
注意事项:
# 后面要有空格
单行代码用``
代码块用```包起来
缩进可能变成代码块
换行可能导致有序列表断开