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

Mapping DTO an Entity, leave entity null if all your field is null

我的实体是 return 个字段 null 示例:EntityTest{id=null, name=null}

但我需要,如果所有字段都为空 return 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

我建议只执行 toString 以检查所有 null 情况:

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

所以如果这个 returns "id:null,name:null" 然后你可以确定它是 null 并且 return 在检查 equals

之后是 null

在即将发布的 1.5 版本中,MapStruct 添加了对条件映射的支持。在当前发布的 1.5 Beta2 中,不支持条件支持参数。但是,有一个开放的enhancement request为源参数添加这个。

这意味着您可以执行以下操作:

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 没有其他开箱即用的解决方案。