当前位置: 首页 > 知识库问答 >
问题:

使用MapStruct的嵌套列表映射

艾俊晖
2023-03-14

我如何在下面的场景中使用Mapstruct进行bean映射。

class Source {
private String sourceId;
private List<Course> courses;  //always returns only one course
}

class Course {
private String courseName;
private List<Student> students; 
}

class Student {
private String studentName;
}

class Target {
private String targetId;
private String subjectName;
private List<Member> members;
}

class Member {
private String memberName;
}

现在我想把sourceId映射到targetId,courseName映射到subjectName,studentName映射到memberName(list到list)。

共有1个答案

滕鸿畴
2023-03-14

首先,Source总是包含一门课程,为什么不将其设为课程元素而不是List

如果您这样做,映射会简单得多。使用您当前的设置,它会有点复杂。

@Mapper
public interface MyMapper {

    @Mapping(target = "targetId", source = "sourceId")
    @Mapping(target = "subjectName", source = "courses")
    @Mapping(target = "members", source = "courses")
    Target map(Source source);

    default String subjectName(List<Course> courses) {
        if (courses == null || courses.isEmpty()) {
            return null;
        }
        return courses.get(0).getCourseName();
    }

    default List<Member> toMembersFromCourses(List<Course> courses) {
        if (courses == null || courses.isEmpty()) {
            return null;
        }
        return toMembers(courses.get(0).getStudents());
    }

    List<Member> toMembers(List<Student> students);

    @Mapping(target = "memberName", source = "studentName")
    Member toMember(Student student);
}

如果课程不是列表。然后你可以用1.2.0.Final做得更优雅。

@Mapper
public interface MyMapper {

    @Mapping(target = "targetId", source = "sourceId")
    @Mapping(target = "subjectName", source = "course.courseName")
    @Mapping(target = "members", source = "course.students")
    Target map(Source source);

    @Mapping(target = "memberName", source = "studentName")
    Member toMember(Student student);
}
 类似资料:
  • 我正在尝试映射我的遗留API对象(我无法更改它),该对象具有嵌套的原始类型属性。列表的元素与DTO列表的元素不兼容,应显式映射为嵌套。不幸的是,MapStruct似乎认为原始与所有类型化列表兼容,并忽略了我试图指定的任何映射,而生成的代码不能正常工作,随后在序列化程序的某个地方产生错误。 我的API对象具有嵌套的原始类型列表: 我的DTO对象具有DTO值类型元素的泛型类型列表: ...但MapSt

  • 我不确定如何将嵌套的结果集映射到域实体中。 以下是我想做的事情的大概想法: 2张桌子 域实体(包含嵌套列表) LoanEntity.java Book.java 持久实体 Loans.java Dao.xml(不知道如何映射它,尝试使用一个) 注意:此查询将复制找到的#本书的记录。 LoanMapper.java 下面的错误是我得到的: 错误:结果类型中的未知属性“books.bookName”c

  • 我尝试使用MapStruct编写映射器类,如下所示: 目前它显示了“未知属性”“customer.customerid”和“usertypes.usertype.userid”等错误。有人能帮我用MapStruct映射所有这些元素吗? 问题2:我们如何绘制跟踪图?1)customerId usertypes->user->userid 2)pdtPrice offers->OffersType->

  • 我创建映射如下所示。如何将平面dto对象属性(街道、城市等)映射到域对象中的嵌套地址。当我试着去做的时候,我发现了一个错误: [错误]诊断:返回类型中的属性“Address.PostalCode”未知。@Mapping(来源=“City”,目标=“Address.City”), 还有类...

  • 假设我有这些实体: null

  • 有人能帮忙填写上面的评论部分吗?或者是否有其他选项来映射这些对象? 编辑:我尝试了下面的解决方案,但是接口实现类本身发生了变化。