java 如何避免jpa更新时空检查

lsmd5eda  于 2023-04-10  发布在  Java
关注(0)|答案(2)|浏览(108)

我想避免null check,同时更新到database的值。但我只需要更新来自UpdateUserRequest对象的值。如何避免多次空检查?源和目标有不同的名称?我需要使用Map structsBeanUtils.copyProperties或什么是最好的方法来实现这些?

@Transactional
public void update(String userId, UpdateUserRequest updateUserRequest) {
    dataRepository.findByUserId(userId)
            .ifPresent(userTransaction -> {
                if(updateUserRequest.getAccountId()!=null)
                {
                    userTransaction.setAccountId(updateUserRequest.getAccountId());
                }
                if(updateUserRequest.getUserAmount()!=null)
                {
                    userTransaction.setUserAmount(updateUserRequest.getUserAmount());
                }
                if(updateUserRequest.getSendDate() != null)
                {
                    userTransaction.setUserRequestedDate(Date.valueOf(updateUserRequest.getSendDate()));
                }

                if(updateUserRequest.getDelDate() != null)
                {
                    userTransaction.setDelDate(Date.valueOf(updateUserRequest.getDelDate()));
                }

                dataRepository.save(userTransaction);
            });
}
xurqigkl

xurqigkl1#

你可以通过在对象级别添加验证来避免空检查,spring提供了@Valid annotation,你可以检查更多的here at baeldung来验证对象并避免空检查,其他选项将使用来自google的Preconditions,或者在实体级别处理它,注解非null的列,并让方法不检查,而只是保存,存储库将抛出,因为传递了null,您可以处理异常,返回一些消息或失败的响应,check here用于使列非空

bn31dyow

bn31dyow2#

我需要使用Map结构体或BeanUtils.copyProperties吗?或者实现这些的最佳方法是什么?
是的,对我来说,Mapstruct完全适合你的目的,例如:

@Mapper(uses = DateMapper.class)
public interface TestMapper {

    @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) // if a source's property is null, ignore it
    @Mapping(source = "differentValue", target = "value") // Map to different property name
    void updateAppearanceFromDto(@MappingTarget Test mappingTarget, TestDto appearanceRequestDto); 
}

// help with different type cast
class DateMapper {
   public Date asDate(String date) {
      return Date.valueOf(date);
   }
}

当然,如果您的项目只需要在这个实体上执行null-check-then-set,那么手动执行会更好,因为依赖项开销的成本。

相关问题