2017-07-26 451 views
0

我試圖將Entity對象映射到DTO以轉移到前端應用程序。 查詢返回包含institutionName和internalName的列表,我想將它們映射到DTO中的ModelsInstitution和modelsInternalName列表。 我被我的mappers類困住了。構造:將List中的對象映射到對象

下面是我的實體:

@Entity 
@DynamoDBTable(tableName = "Inventory") 
public class Inventory 
{ 
    @Id 
    private String id; 
    private String institutionName; 
    private String internalName; 
    private String lanAdapter; 

    public Inventory() { 
    } 

    public Inventory(String Id,String InstitutionName, String LanAdapter, String InternalName) 
    { 
     this.id = Id 
     this.lanAdapter = LanAdapter; 
     this.institutionName = InstitutionName; 
     this.internalName = InternalName; 

    } 

    @DynamoDBHashKey(attributeName = "Id") 
    public String getId() 
    { 
     return id; 
    } 
    public void setId(String id) 
    { 
     this.id=id; 
    } 

    @DynamoDBAttribute(attributeName = "InstitutionName") 
    public String getInstitutionName() 
    { 
     return institutionName; 
    } 
    public void setInstitutionName(String InstitutionName) 
    { 
     this.institutionName = InstitutionName; 
    } 

    @DynamoDBAttribute(attributeName = "LanAdapter") 
    public String getLanAdapter() 
    { 
     return lanAdapter; 
    } 
    public void setLanAdapter(String LanAdapter) 
    { 
     this.lanAdapter = LanAdapter; 
    } 

     @DynamoDBAttribute(attributeName = "InternalName") 
    public String getInternalName() 
    { 
     return internalName; 
    } 
    public void setInternalName(String InternalName) 
    { 
     this.internalName = InternalName; 
    } 
} 

下面是我的DTO對象:

public class FilterDto 
{ 
    private List<String> modelsInstitution; 
    private List<String> modelsInternalName; 

    public FilterDto(List<String> modelsInstitution, List<String> versions) { 
     super(); 
     this.modelsInstitution = modelsInstitution; 
     this.modelsInternalName = modelsInternalName; 
    } 

    public List<String> getModelInstitution() { 
     return modelsInstitution; 
    } 
    public void setModelInstitution(List<String> modelsInstitution) { 
     this.modelsInstitution = modelsInstitution; 
    } 
    public List<String> getModelInternalName() { 
     return modelsInternalName; 
    } 
    public void setModelInternalName(List<String> modelsInternalName) { 
     this.modelsInternalName = modelsInternalName; 
    } 
} 

映射類:

我的映射是不正確的,我錯過了如何在地圖實體列入DTO。

@IterableMapping(elementTargetType = Inventory.class) 
@Mappings({ 
    @Mapping(target="modelsInstitution", expression="java(inventory.getInstitution())"), 
    @Mapping(target="modelsInternalName", expression="java(inventory.getInternalName())") 
}) 
FilterDto InventoryToFilterDTO1(List<Inventory> inventory); 
+0

你一定要看看lombok:https://projectlombok.org/ – Krzysiek

回答

1

你不能用MapStruct乾淨地做到這一點。我建議你手動做這個映射。

你的映射可以是這樣的:

public interface MyMapper { 

    default FilterDto InventoryToFilterDTO1(List<Inventory> inventory) { 
     List<String> institutions = new ArrayList<>(inventory.size()); 
     List<String> names = new ArrayList<>(inventory.size()); 

     for(Inventory inv: inventory) { 
      institutions.add(inv.getInstitution()); 
      names.add(inv.getInternalName())); 
     } 

     return new FilterDto(institutions, names); 
    } 
} 

從理論上說,有可能是一種方式與MapStruct做到這一點,利用@Context@AfterMapping@BeforeMapping@ObjectFactory。但是,這將更加複雜。