Java Mapstruct:在id上加入

Java Mapstruct:在id上加入,java,mapping,mapstruct,Java,Mapping,Mapstruct,我使用Mapstruct将生成的DTO(metro、xsd)映射到我们的业务域对象。我的困难在于DTO实际上并不引用子对象,而是使用ID引用关联实例 尝试将其分解为一个简化的案例,我给出了一个示例: SchoolDTO有一份教师和课程列表。老师 课程仅通过每门课程中的教师ID引用 在商业领域,学校只有一份每位教师的名单 持有他们课程的清单 类图: 最初,我希望用mapstruct语法解决这个问题,比如在foreigned和teacher id(或一些限定的关联)上加入一个连接,伪代码,如下所示:

我使用Mapstruct将生成的DTO(metro、xsd)映射到我们的业务域对象。我的困难在于DTO实际上并不引用子对象,而是使用ID引用关联实例

尝试将其分解为一个简化的案例,我给出了一个示例:

  • SchoolDTO有一份教师和课程列表。老师 课程仅通过每门课程中的
    教师ID
    引用

  • 在商业领域,学校只有一份每位教师的名单 持有他们课程的清单

  • 类图:

    最初,我希望用mapstruct语法解决这个问题,比如在foreigned和teacher id(或一些限定的关联)上加入一个连接,伪代码,如下所示:

    @Mapping(source="courses", target="teachers.courses", where="teacher.id = course.teacherId")
    
    DTO:

    公立学校{
    列出教师名单;
    列出课程;
    }
    公共课教师{
    字符串id;
    字符串名;
    }
    公共课{
    字符串名;
    弦教师;
    }
    
    域:

    public class School {
        List<Teacher> teachers;
    }
    
    public class Teacher {
        String name;
        List<Course> courses;
    }
    
    public class Course {
        String name;
    }
    
    公立学校{
    列出教师名单;
    }
    公共班主任{
    字符串名;
    列出课程;
    }
    公共课{
    字符串名;
    }
    

    我现在正在使用相当大的
    @AfterMapping
    方法来解决这个问题,但我觉得这并不是一个特殊的用例,所以我可能遗漏了一些非常明显的东西。在使用Mapstruct的映射中,解决这些类型的“连接”的正确/预期方法是什么?

    如果没有
    @AfterMapping
    ,我怀疑您能否做到这一点。MapStruct“只是”用于将一个对象映射到另一个对象,它不支持任何类型的查询来查找或连接数据

    如果您还没有使用它,这听起来像是一个使用上下文的好用例。那么
    @AfterMapping
    就不是很大了:

    @Mapper
    公共抽象类学校地图绘制程序{
    公立学校到学校(学校到学校){
    返回学校(school,school.getCourses());
    }
    受保护的抽象学校到学校(学校到学校,@上下文列表课程);
    @映射(target=“courses”,ignore=true)//参见AfterMappingToTech
    受保护的抽象教师对教师(教师对教师,@Context-List-courses);
    受保护的抽象课程到课程(课程到课程);
    @后映射
    void afterMappingToTeacher(@MappingTarget-target,TeacherDto-source,@Context-List-courses){
    //省略的空检查
    列出课程=新建ArrayList();
    用于(课程到课程:课程){
    if(course.getTeacherId().equals(source.getId())){
    课程。添加(至课程(课程));
    }
    }
    目标。设置课程(课程);
    }
    }
    
    (使用Java>=8时,可以使用带有默认方法的接口)

    如果您需要多次查询,您可以创建一个自己的类作为上下文,例如,该类有自己的方法通过教师ID查找所有课程

    public class School {
        List<Teacher> teachers;
    }
    
    public class Teacher {
        String name;
        List<Course> courses;
    }
    
    public class Course {
        String name;
    }