【问题标题】:How to Insert or Update(NOT INSERT ONLY) using saveAll() method如何使用 saveAll() 方法插入或更新(不只插入)
【发布时间】:2021-10-20 01:32:07
【问题描述】:

我有一张桌子叫User

我正在处理一项任务,我想从 CSV/XLSX 文件中插入多个用户。

我可以保存所有记录

List<User> userList = new ArrayList<>();


for (int i = 0; i < worksheet.getPhysicalNumberOfRows(); i++) {
                User user = new User();
                XSSFRow row = worksheet.getRow(i);
                user.setName(row.getCell(0).getStringCellValue());
                userList.add(user);
            }
userRepository.saveAll(userList);

但现在的问题是,如果文件包含重复记录,或者如果我尝试再次插入同一个用户,那么它也会保存在表中,我不希望这样。

我想保留没有重名的用户。

我的实体很简单,有类似的字段

private Long userId;
private String name;

让我知道如何避免重复记录插入。

任何帮助将不胜感激。

注意事项:

我知道如何从数组列表中删除重复项。这不是问题。问题是,如果我尝试从新的 CSV/XLSX 文件中添加记录,并且该文件具有表中可用的相同名称,那么我不想在表中插入这些名称。

【问题讨论】:

    标签: java spring-boot jpa repository


    【解决方案1】:

    我建议您不要使用List&lt;User&gt;,而是使用Set&lt;User&gt; 并根据您的要求覆盖hashCode() 和equals()。

    阅读该注释部分后,如果您只想在表中插入新名称而不更改实体结构,您可以执行以下操作,

    interface UserRepository extends JPARepository {
      public List<User> findByName(List<String> names);
    }
    

    您可以使用上述方法从未保存的用户列表中获取已经存在的名称记录,删除重复并保存剩余的名称。

    【讨论】:

      【解决方案2】:
      List<User> userList = new ArrayList<>();
      
      
      for (int i = 0; i < worksheet.getPhysicalNumberOfRows(); i++) {
                  User user = new User();
                  XSSFRow row = worksheet.getRow(i);
      
                  User testUser = userList.get(userList.size()-1) //returns the last user
                  testUser.setName(row.getCell(0).getStringCellValue());
      
                  if (userList.contains(testUser)) continue; //skips
      
                  user.setName(row.getCell(0).getStringCellValue());
                  userList.add(user);
              }
      userRepository.saveAll(userList);
      

      现在简单来说,您获取您保存的最后一个用户并将其添加到变量 testUser 中以获取最后一个 id,然后您设置名称并检查该用户是否已经存在

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-15
        • 1970-01-01
        • 2020-05-06
        • 1970-01-01
        • 2018-10-11
        相关资源
        最近更新 更多