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渲染引擎的原因。

这篇博客就是因为单行代码用```包起来,所以导致了格式错误。

注意事项:

# 后面要有空格

单行代码用``

代码块用```包起来

缩进可能变成代码块

换行可能导致有序列表断开