【问题标题】:How created multi update query with JPA data?如何使用 JPA 数据创建多更新查询?
【发布时间】:2022-06-28 05:59:28
【问题描述】:

我尝试创建查询 setAll ,因为一个具有顶部 isValid 的实体并且我希望所有值在我使用 saveAll 用于 udpade maj 数据库之前都为 false,我使用这种方法同步我的数据库,批次为 6000-7000 ligne。

import org.springframework.data.repository.CrudRepository;
public interface  DomRepository extends CrudRepository<Dom, String> {

    public Domaine findDomByName(String dom);
    public List<Dom> findAll();
    public void setIsValidAll(boolean isValid);

}
import javax.persistence.*;
import org.hibernate.annotations.DynamicUpdate;
import org.springframework.data.annotation.CreatedDate;
@Entity
@DynamicUpdate
public class Dom{
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    private String name;
    // more attribute
    private boolean isValid;
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property 'setIsValidAll' found for type 'Dom'!

【问题讨论】:

    标签: java spring spring-data-jpa


    【解决方案1】:

    根据您提供的描述,您想要实现的目标并不完全清楚,但如果我做对了,您希望创建一个存储库,以便有效更新所有 @987654322 的 isValid 字段的值@对象。如果确实如此,那么您可以简单地创建一个自定义存储库方法,该方法将接受您的标志,并使用简单的 HQL 或 JPQL 来更新数据库中的所有记录。例如,这样的事情可能适用于这种情况:

    @Modifying
    @Query("UPDATE Dom SET isValid = :valid")
    void updateValidAll(boolean valid);
    

    另一方面,如果您想在内存中对获取的实体执行更新,然后执行saveAll,您可以执行以下操作:

    @Transactional
    public void updateAllRecords2(boolean isValid) {
        var records = repository.findAll()
            .stream()
            .peek(dom -> dom.setValid(isValid))
            .toList();
        repository.saveAll(records);
    }
    

    请注意,后者不是很理想,因为它使用 peek,不应将其用于具有副作用(即突变)的操作。最重要的是,将为存在的每个实体执行更新查询,这意味着 N 个实体的 N 个查询。

    【讨论】:

      猜你喜欢
      • 2019-10-01
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 2019-07-24
      • 2020-02-26
      • 2012-04-29
      • 2020-02-08
      • 1970-01-01
      相关资源
      最近更新 更多