【问题标题】:Spring Data JPA: update a list of Entity using a list of input in a custom QuerySpring Data JPA:使用自定义查询中的输入列表更新实体列表
【发布时间】:2020-04-06 09:38:19
【问题描述】:

我有以下基本对象:

/* User class */

import lombok.Data;
import lombok.AllArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.Id
import javax.persistence.GeneratedValue;
import javax.persistence.ManyToOne;

@Data
@Entity
@AllArgsConstructor
public class User {

  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  private Long id;

  private String name;
  private String surname;

  @ManyToOne
  private Address address;
}

/* UserComposite class, used to load partial data from a user */

import lombok.Data;
import lombok.AllArgsConstructor;

@Data
@AllArgsConstructor
public class UserComposite {

  private Long userId;
  private String name;
  private String surname;
}

我的目标是使用 UserComposite 列表作为输入来更新用户列表。这是我的 DAO 的样子:

/* UserDao class */    

import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;

public interface UserDao extends JpaRepository<User, Long> {

  @Transactional
  @Modifying
  @Query("update User u set u.name = uc.name , "
      + "u.surname = uc.surname "
      + "where u.id = uc.userId "
      + "and UserComposite uc in (?1)")
  void updateUserFromCompositeList(List<UserComposite> userCompositeList);
}

但是,这不起作用。我很难将输入中的数据与保存在我的数据库中的数据进行匹配,尤其是因为 UserComposite 不是实体。

有没有办法解决这个问题?

【问题讨论】:

    标签: java hibernate spring-data-jpa


    【解决方案1】:

    不可能在一个查询中使用不同的IDs 值更新多行。

    通过 id 更新每个用户

    for (UserComposite user : List<UserComposite> userCompositeList) {
       userDao.updateUser(user.getUserId(), user.getName(), user.getSurname());
    }
    

    仓库查询类似

      @Modifying
      @Query("UPDATE User u SET u.name = :name, u.surname = :surname  WHERE u.id = :userId")
      void updateUser(@Param("userId") int userId, @Param("name") String name, @Param("surname") String surname);
    

    【讨论】:

    • 感谢您的回答! Hibernate 是否知道像批处理一样进行有用的迭代?
    • @AsfK Hibernate 没有为此做批量更新,也没有批量更新查询。
    • 谢谢,我真的在寻找批量更新,现在我可以停下来了:) 我会检查是否值得批量删除和插入而不是更新(~1M.记录)跨度>
    猜你喜欢
    • 2016-09-30
    • 2016-09-17
    • 1970-01-01
    • 2015-12-07
    • 2020-06-16
    • 1970-01-01
    • 2018-12-03
    • 2019-02-15
    • 2015-03-25
    相关资源
    最近更新 更多