将DTO映射到实体,如果所有字段都为null,则保留实体为null



我的实体返回字段为null示例:EntityTest{id=null,name=null}

但我需要,如果所有字段都为null,则返回EntityTest=null

测试实体

@Entity
@Table(name="TestEntity")
public class TestEntity {
@Id
@Column(name="id")
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name="test_name")
private String testName;
}

TestEntityDto

public class TestEntityDto {
private long id;
private String test_name;
}

TestEntityMapper

@Mapper
public interface TestEntityMapper {
TestEntity TestEntityDTOToTestEntity(TestEntityDTO testEntityDTO);

实施

testEntityDTO.setId(null);
testEntityDTO.setNameTest(null);
TestEntity testEntity = TestEntityMapper.TestEntityDTOToTestEntity(testEntityDTO);

实际结果:

EntityTest{id=null, name=null}

预期结果:

EntityTest = null

在即将发布的1.5版本中,MapStruct添加了对条件映射的支持。在当前发布的Beta2 1.5中,不支持条件支持参数。但是,有一个开放的增强请求,要求将其添加到源参数中。

这意味着你可以做一些类似的事情:

public class MappingUtils {
@Condition
public static boolean isPresent(TestEntityDTO dto) {
if (dto == null) {
return false;
}
return dto.getId() != null || dto.getName() != null;
}
}

这意味着你可以有一个像这样的映射器

@Mapper(uses = MappingUtils.class)
public interface TestEntityMapper {
TestEntity testEntityDTOToTestEntity(TestEntityDTO testEntityDTO);
}

实现方式将看起来像:

public class TestEntityMapperImpl implements {
@Override
public TestEntity testEntityDTOToTestEntity(TestEntityDTO dto) {
if (!MappingUtils.isPresent(dto)) {
return null
}
// the rest of the mapping
}
}

注意:这在发布版本中还不可能,但这就是它的工作方式。除了这个未来的解决方案,MapStruct没有其他现成的解决方案。

我建议实现toString只是为了检查所有null的情况:

toString(){"id:"+id+",name:"+name;}

因此,如果这返回";id:null,name:null"然后你可以确定它是空的,并在检查等于后返回空

相关内容

  • 没有找到相关文章

最新更新