【问题标题】:Identify items in list that are already in database and remove them识别列表中已经在数据库中的项目并删除它们
【发布时间】:2020-05-17 10:17:55
【问题描述】:

我有一个实体 Student: ID,名称(字符串),...

我有另一个实体 ArchivedStudents 为: ID, name(字符串), dateArchived, ...

我正在随机生成一个新学生列表,在将此列表保存到学生表之前,我正在执行: 从新学生列表中,我正在尝试删除学生或 ArchivedStudents 中已存在名称的学生。

目前,我正在传递学生姓名列表并检查 ArchiveStudent 表中是否已存在,然后删除重复项。然后检查学生表中是否已经存在该名称,删除重复项,然后保留剩余的。

ArchivedStudents 和 Student 表的记录数以百万计。

我想仔细检查这是否是最佳的,或者是否有更好的方法来做到这一点。我正在使用findAllByStudentIn 方法来识别重复项。

【问题讨论】:

    标签: java sql spring spring-data jpql


    【解决方案1】:

    最好的方法是一次性进入数据库:

    List<Student> students = generateRandomStudents();
    List<String> namesInDb = (List<String>) entityManager.createQuery("select s.name from Student s where s.name in :names")
        .setParameter("names", students.stream().map(Student::getName).collect(toList()))
        .getResultList();
    studentsRepository.saveAll(students.stream().filter(s -> !namesInDb.contains(s.getName())).collect(toList()));
    

    【讨论】:

    • 之后,我必须将过滤后的列表保存到学生表中。有没有办法保存到数据库并忽略重复项?
    • 我目前也在做同样的事情。从 db 中识别重复项,删除它们,并保存过滤后的列表。有没有办法一次性保存忽略重复名称的列表?现在,检查重复项和保存是对 Student 表的两次调用。
    • @rohan 我不是很熟悉 mysql,但我会尝试类似on conflict 子句:mysqltutorial.org/…
    • 尽可能不使用实体管理器并使用 Spring JPA 存储库内置函数。不过谢谢!
    • @rohan 你可以通过EntityManager#createNativeQuery传递任何sql
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2019-09-26
    • 2018-04-19
    相关资源
    最近更新 更多