Java 更新数据时使用多个if语句

Java 更新数据时使用多个if语句,java,Java,它是关于通过web请求更新数据,并且仅当参数数据不为空时才更新数据。我已经检查了常用的重构方法,但似乎想不出更好的方法 if (StringUtils.isNotBlank(request.getFieldA()) { dataModel.setFieldA(request.getFieldA()); jpaRepository.save(dataModel); auditChange(request.getFieldA()); } 添加新字段时会出现问题。如果使用类似的构造添加新

它是关于通过web请求更新数据,并且仅当参数数据不为空时才更新数据。我已经检查了常用的重构方法,但似乎想不出更好的方法

if (StringUtils.isNotBlank(request.getFieldA()) {
  dataModel.setFieldA(request.getFieldA());
  jpaRepository.save(dataModel);
  auditChange(request.getFieldA());
}
添加新字段时会出现问题。如果使用类似的构造添加新的If语句,它将更新数据库两次,这似乎是不可取的

if (StringUtils.isNotBlank(request.getFieldB()) {
  dataModel.setFieldB(request.getFieldB());
  jpaRepository.save(dataModel);
  auditChange(request.getFieldB());
}
如果添加了原始的“If语句”检查,它可以避免多次数据库更新,但对于干净的代码和在第三个字段出现时开放扩展来说,这也不是一个很好的方法

if (StringUtils.isNotBlank(request.getFieldA()) || StringUtils.isNotBlank(request.getFieldB()) {
                dataModel.setFieldA(StringUtils.isNotBlank(request.getFieldA()) ? request.getFieldA() : dataModel.getFieldA());
                dataModel.setFieldB(StringUtils.isNotBlank(request.getFieldB()) ? request.getFieldB() : dataModel.getFieldB());
                jpaRepository.save(dataModel);
                
                if (StringUtils.isNotBlank(request.getFieldA())) {
                    auditChange(request.getFieldA());
                }

                if (StringUtils.isNotBlank(request.getFieldB())) {
                    auditChange(request.getFieldB());
                }
            }

为什么不将
jpaRepository.save()
if
语句中移出并放在它们下面,这样:

boolean updated = false;
if (StringUtils.isNotBlank(request.getFieldB()) {
  dataModel.setFieldB(request.getFieldB());
  updated = true;
  auditChange(request.getFieldB());
}
if (StringUtils.isNotBlank(request.getFieldA()) {
  dataModel.setFieldA(request.getFieldA());
  updated = true;
  auditChange(request.getFieldA());
}
if (updated)
  jpaRepository.save(dataModel);
或者,如果更新数据库后必须进行
auditChange

boolean updated = false;
if (StringUtils.isNotBlank(request.getFieldB()) {
  dataModel.setFieldB(request.getFieldB());
  updated = true;
}
if (StringUtils.isNotBlank(request.getFieldA()) {
  dataModel.setFieldA(request.getFieldA());
  updated = true;
}
if (updated)
  jpaRepository.save(dataModel);
if (StringUtils.isNotBlank(request.getFieldB()) {
  auditChange(request.getFieldB());
}
if (StringUtils.isNotBlank(request.getFieldA()) {
  auditChange(request.getFieldA());
}

您的用例与补丁请求的相似性-仅在请求中定义更改字段。(请注意,在您的实现中,如何故意将字段设置为null?)


查看Spring Boot中json补丁实现的详细信息

让JPA/Hibernate处理事务中实体的更新/更改字段。 只需在Hibernate实体pojo上添加注释
@DynamicInsert
@DynamicUpdate
以及
@Entity

大概是这样的:

@Entity
@Table(name = "users")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@DynamicInsert
@DynamicUpdate
public class User {
//...
}
@DynamicInsert
注释指出,对于插入,该实体是否应该使用动态sql生成,其中在准备好的sql语句中只引用非空列

@DynamicUpdate
注释指出,为了更新,该实体是否应该使用动态sql生成,其中在准备好的sql语句中只引用更改的列


注意:如果您发现sql
insert
操作运行不正常,可以删除
@DynamicInsert
。(有时我也是如此。)

强制性的lambda和streams解决方案:

     static boolean updateField(String newValue, Consumer<String> setter ) {
             if (StringUtils.isNotBlank(newValue)) {
                 setter.accept(newValue);
                 auditChange(newValue);
                 return true;
             }
             return false;
     }
...

         if (Stream.of(
                 updateField(request.getFieldA(), v -> model.setFieldA(v)),
                 updateField(request.getFieldB(), v -> model.setFieldB(v))
                 ).anyMatch(b -> b))
         {
             jpaRepository.save(dataModel);
         }
静态布尔更新字段(字符串newValue,使用者setter){
if(StringUtils.isNotBlank(newValue)){
setter.accept(newValue);
审核变更(新值);
返回true;
}
返回false;
}
...
如果(流)(
updateField(request.getFieldA(),v->model.setFieldA(v)),
updateField(request.getFieldB(),v->model.setFieldB(v))
).anyMatch(b->b))
{
jpaRepository.save(数据模型);
}
anyMatch
在找到第一个真值时停止,但这没关系,因为我们在创建流时预先做了副作用