【问题标题】:Bulk data to find exists or not : Spring Data JPA要查找的批量数据是否存在:Spring Data JPA
【发布时间】:2018-09-21 12:27:10
【问题描述】:

我收到了一个Post 请求,它会给我一个List<PersonApi> 对象

class PersonApi {
  private String name;
  private String age;
  private String pincode ;
}

我有一个名为Person的实体对象

@Entity
@Table(name = "person_master")
public class Person{

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

    @Column(name = "name")
    String name;

    @Column(name = "age")
    String age;

    @Column(name = "pincode ")
    String pincode ;
}

我的 Post 请求记录看起来像这样(下面数据的伪代码表示)

[
"Arun","33","09876gh"
"James","34","8765468"
]

我需要使用 Spring JPA 进行批量验证。根据 PersonApi 对象列表中的所有条目都应该在数据库。

如何做到这一点?

【问题讨论】:

    标签: spring spring-boot spring-data-jpa spring-data


    【解决方案1】:

    所选答案不正确。 (并不总是正确的) 您正在选择整个数据库来检查是否存在。除非您的用例非常特殊,即表非常小,否则这会影响性能。

    正确的方法可能是从为每个人发出 repository.existsById(id) 开始,如果你从不删除这些人,你甚至可以在它上面应用一些缓存。

    exists

    【讨论】:

      【解决方案2】:

      伪代码:

      List<PersonApi> personsApiList = ...; //from request
      List<Person> result = personRepository.findAll();
      

      在您的服务类中,您可以访问您的存储库以获取所有数据库实体并检查您的 personapi 列表是否完整可用。

      boolean allEntriesExist = result.stream().allMatch(person -> personsApiList.contains(createPersonApiFromPerson(person)));
      
      public PersonApi createPersonApiFromPerson(Person person){
         return new PersonApi(person.getName(), person.getAge(), person.getPincode());
      }
      

      【讨论】:

      • 太棒了。谢谢
      • 但我看到的唯一缺点是,如果person_master 表非常大,那么每次执行findAll() 将是昂贵且不必要的批量获取..
      猜你喜欢
      • 1970-01-01
      • 2017-08-08
      • 2018-01-23
      • 2021-11-27
      • 1970-01-01
      • 2018-06-13
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多