我只需要记录那些将在更新API调用期间更新的字段.例如,如果我的表中有10列,但在API调用中只更新了3列,则应该只记录这3个字段.

我试过这样做,但它不能覆盖所有条件,有时还会给出空值.

在这里,我在为更新调用Get和Set函数之前判断现有Employee值是否等于即将到来的有效负载的值,但如果任何值将为空,则抛出错误.

已try 的代码

//existingOrgEmployee is DB mysql entry
// and employeeInfo is coming Request from Api Payload
if (employeeInfo.getEmployeeFirstName() != null) { 
               if(!existingOrgEmployee.getFirstName().equals(employeeInfo.getEmployeeFirstName())){
                    log.info("EmployeeFirstName Updated for Orgemployee  : 
                         "+existingOrgEmployee.getOrgEmployeeId());
                }
                existingOrgEmployee.setFirstName(employee Info.getEmployeeFirstName());
            }

在有效负载中,所有字段都将存在,但只有数据库列中不同或为空的字段将被更改,这就是为什么我在设置函数之前应用了IF条件

这是Service Class内的更新函数

 private void updateExistingEmployee(OrgEmployeeMap existingOrgEmployee, RequestMessage requestMessage) {
        try {
            EmployeeInformation employeeInfo = requestMessage.getData().get(0).getDemographicData().getEmployeeInformation().get(0);

            if (employeeInfo.getEmployeeFirstName() != null) {
               if(!existingOrgEmployee.getFirstName().equals(employeeInfo.getEmployeeFirstName())){
                    log.info("EmployeeFirstName Updated for Orgemployee  : 
                         "+existingOrgEmployee.getOrgEmployeeId());
                }
                existingOrgEmployee.setFirstName(employee Info.getEmployeeFirstName());
            }
            if (employeeInfo.getEmployeeLastName() != null) {

                existingOrgEmployee.setLastName(employeeInfo.getEmployeeLastName());
            }
            if (employeeInfo.getDOB() != null) {

                existingOrgEmployee.setDob(employeeInfo.getDOB());
            }
            if (employeeInfo.getGender() != null) {

                existingOrgEmployee.setGender(employee Info.getGender());
            }
            if (employeeInfo.getEmail() != null) {
                if(!existingOrgEmployee.getEmail().equals(employeeInfo.getEmail())){
                    log.info("Email Updated for Orgemployee  : "+existingOrgEmployee.getEmail());
                }
                existingOrgEmployee.setEmail(employeeInfo.getEmail());
            }

            orgEmployeeMapRepository.save(existingOrgEmployee);

        log.info("Updated Employee : " + existingOrgEmployee);
        } catch (JSONException e) {
            log.error("error in processing the request error", e.getMessage());
        }catch (Exception ex) {
            log.error("An unexpected error occurred: " + ex.getMessage(), ex);
        }

这也不是优化的方法,我如何记录更新的字段?

推荐答案

这可能有点干净,但不是那么完美,但您可以使用这样的对象:

public static class Updater {
  private final OrgEmployeeMap existing;
  private final EmployeeInformation information;
  private final Set<String> updatedFields = new HashSet<>();

  public Updater(OrgEmployeeMap existing, EmployeeInformation information) {
    this.existing = existing;
    this.information = information;
  }

  public <T> Updater update(String fieldName,
                            Function<EmployeeInformation, T> newValueGetter,
                            Function<OrgEmployeeMap, T> oldValueGetter,
                            BiConsumer<OrgEmployeeMap, T> oldValueSetter) {
    final var newValue = newValueGetter.apply(information);
    final var oldValue = oldValueGetter.apply(existing);
    if (newValue == null || newValue.equals(oldValue)) {
      return this;
    }
    this.updatedFields.add(fieldName);
    oldValueSetter.accept(existing, newValue);
    return this;
  }

  public Set<String> getUpdatedFields() {
    return updatedFields;
  }
}

然后在您的方法中使用它,如下所示:

private void updateExistingEmployee(OrgEmployeeMap existingOrgEmployee, RequestMessage requestMessage) {
    try {
        EmployeeInformation employeeInfo = requestMessage.getData().get(0).getDemographicData().getEmployeeInformation().get(0);
        final var updater = new Updater(existingOrgEmployee, employeeInfo);

        updater
            .update("FirstName", EmployeeInformation::getEmployeeFirstName, OrgEmployeeMap::getFirstName, OrgEmployeeMap::setFirstName)
            .update("LastName", EmployeeInformation::getEmployeeLastName, OrgEmployeeMap::getLastName, OrgEmployeeMap::setLastName)
            .update("DOB", EmployeeInformation::getDOB, OrgEmployeeMap::getDob, OrgEmployeeMap::setDob)
            .update("Gender", EmployeeInformation::getGender, OrgEmployeeMap::getGender, OrgEmployeeMap::setGender)
            .update("Email", EmployeeInformation::getEmail, OrgEmployeeMap::getEmail, OrgEmployeeMap::setEmail);

        final var modifiedFields = updater.getUpdatedFields();
        if (!modifiedFields.isEmpty()) {
            log.info("Updated employee : " + String.join(", ", modifiedFields));
        }

        orgEmployeeMapRepository.save(existingOrgEmployee);

        log.info("Updated Employee : " + existingOrgEmployee);
    } catch (JSONException e) {
        log.error("error in processing the request error", e.getMessage());
    } catch (Exception ex) {
        log.error("An unexpected error occurred: " + ex.getMessage(), ex);
    }
}

Java相关问答推荐

int Array Stream System. out. print方法在打印Java8时在末尾添加% sign

JsonPath在多个线程中返回错误的值

工件部署期间出错[Tomcat 8.5.45]

我无法将附件发送到NetBeans之外

XPages-在第二次点击按钮之前延迟

Exe4j创建的应用程序无法再固定在任务栏Windows 11上

在Java Swing Paint应用程序中捕获快速鼠标移动时遇到困难

Chunk(Int)已弃用并标记为要删除

使SLF4J在Android中登录到Logcat,在测试中登录到控制台(Gradle依赖问题)

如何从日期中截取时间并将其传递给组件?

Sack()步骤中的合并运算符未按预期工作

使用Jackson库反序列化json

Maven-Dependency-Plugin 3.6.+开始查找在依赖关系:分析目标期间找到的新的使用的未声明依赖关系

接受类及其接口的Java类型(矛盾)

我无法在我的Spring Boot应用程序中导入CSV依赖项

如何在MPAndroidChart中的条形图上正确添加标签

java21预览未命名的符号用于try-with-resources

";重复键的值提示唯一约束«;livre_genre_pkey»";例外

如何在Java上为循环数组从synchronized迁移到ReentrantLock

睡眠在 Spring Boot 中