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

Java Spring Boot JPA一次一对多更新多个实体,java,spring,spring-boot,hibernate,jpa,Java,Spring,Spring Boot,Hibernate,Jpa,我需要更新所有按ID过滤的实体,我可以对单个实体执行此操作,它工作正常,但如何对多个实体执行此操作 下面是一对一更新的成功示例 @Override public FullPack updatePack(FullPack fullPack, int id) { FullPack newFullPack = fullPackRepository.findByPackId(id); newFullPack.setPackCompose(fullPack.getPackCompose(

我需要更新所有按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的多个完整包,那么如何更新所有完整包

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

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

如何使用JPA实现这种情况,并非所有存储库接口中的大多数都会公开一个.saveAll方法,该方法为您打开保存集合的路径

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

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

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

对于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);
不要预测@modifying。您必须@autowire需要更新的存储库。
您可以用JPQL或本机查询编写查询。

您可以使用存储库编写查询

@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);
不要预测@modifying。您必须@autowire需要更新的存储库。
您可以用JPQL或本机查询编写查询。

使用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;

}

使用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;

}

是否要为所有fullPack更新相同的数据?是的,我需要为所有fullPack添加相同的数据。一对多映射更新所有使用循环并使用saveAll进行列表更新如果您可以添加代码部分,这将非常棒,我有点困惑。我的想法类似于回答您想要为所有fullPack更新相同的数据?是的,我需要为所有fullPack添加相同的数据。一对多映射更新所有使用循环并使用saveAll进行列表更新如果您可以添加代码部分,那将非常棒,我有点困惑。我的想法类似于Answer我认为这没有任何意义,您将获得fullPack的列表并使用它做任何事情,我的意思是,您正在保存从数据库检索到的同一对象,并且没有对其进行更改。看起来像是贝茨·诺伯特的答案,但你的答案不完整!。现在,它更好了,但仍然是相同的代码。哈哈,这没关系,因为开发人员可以使用stream,`method,任何东西来迭代这些信息。我只是简单地指向spring Database提供的saveAll repository方法。我认为这没有任何意义,你可以得到fullPack的列表,并用它做任何事情,我的意思是,您正在保存从数据库检索到的同一对象,并且没有对其进行更改。看起来像是贝茨·诺伯特的答案,但你的答案不完整!。现在,它更好了,但仍然是相同的代码。哈哈,这没关系,因为开发人员可以使用stream,`method,任何东西来迭代这些信息