Spring Data JPA: обновить список сущностей, используя список ввода в пользовательском запросе - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть следующие основные c объекты:

/* 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 не является сущностью.

Есть ли способ обойти эту проблему?

1 Ответ

1 голос
/ 06 апреля 2020

Обновление нескольких строк с разными значениями на основе идентификатора невозможно в одном запросе.

Обновление каждого пользователя по идентификатору

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);
...