Spring Boot JPA一次一次更新多个实体

问题描述

我需要更新所有按ID过滤的实体,我可以对单个实体执行此操作,并且可以正常工作,但是如何对多个实体执行此操作。

这是一次一对一更新的成功示例

@Override
public FullPack updatePack(FullPack fullPack,int id) {

    FullPack newFullPack = fullPackRepository.findByPackId(id);
    newFullPack.setPackCompose(fullPack.getPackCompose());
    newFullPack.setPackSequence(fullPack.getPackPackSequence());
    FullPack savedFullPack = fullPackRepository.save(newFullPack);


    return savedFullPack;
} 

假设我将基于findByPackId获得多个FullPack,然后如何更新所有

@Override
public List<FullPack> updatePack(FullPack fullPack,int id) {

    List<FullPack> newFullPack = fullPackRepository.findByPackId(id);
    //////////////////
    /////////////////
} 

我该如何做这种情况

解决方法

使用for循环迭代列表:

@Override
public List<FullPack> updatePack(FullPack fullPack,int id) {

    List<FullPack> newFullPackList = fullPackRepository.findByPackId(id);
   
    for (FullPack newFullPack : newFullPackList) {
        newFullPack.setPackCompose(fullPack.getPackCompose());
        newFullPack.setPackSequence(fullPack.getPackPackSequence());
    }

    fullPackRepository.saveAll(newFullPackList);
    
    return newFullPackList;

}
,

使用JPA时,并非在所有存储库接口中,大多数都公开了.saveAll()方法,该方法为您打开保存集合的路径。

您可以像这样简单地保存多个FullPack。

@Override
public List<FullPack> updatePack(FullPack fullPack,int id) {

    List<FullPack> newFullPack = fullPackRepository.findByPackId(id);
    ...
    fullPackRepository.saveAll(newFullPack)
} 
,

您可以使用存储库

@Query("update OrdineMacchina o set o.durataEsecuzione = o.durataEsecuzione + :incremento where o.idOrdineMacchina = :idOrdineMacchina")
@Modifying
void updateDuration(@Param("idOrdineMacchina") Long idOrdineMacchina,@Param("incremento")  Integer incremento);

不要忘记@Modifing。您必须@autowire需要更新的存储库。 您可以使用JPQL或本地查询来编写查询。