首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mapstruct:连接id

Mapstruct:连接id
EN

Stack Overflow用户
提问于 2018-07-11 08:41:59
回答 1查看 1K关注 0票数 1

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

为了将其分解为一个简化的案例,我想出了一个例子:

  1. SchoolDTO有一份教师和课程清单。一门课程的老师只能通过teacherId在每门课程中引用。
  2. 在商业领域,学校只有一份教师名单,每个教师都持有他们的课程清单。

类图:UML: DTO / Domain

最初,我希望用mapstruct语法来解决这个问题,比如foreignId上的联接和教师id (或某些qualifiedBy关联),伪代码,如下所示:

代码语言:javascript
复制
@Mapping(source="courses", target="teachers.courses", where="teacher.id = course.teacherId")

DTO:

代码语言:javascript
复制
public class SchoolDto {
    List<TeacherDto> teachers;
    List<CourseDto> courses;
}

public class TeacherDto {
    String id;
    String name;
}

public class CourseDto {
    String name;
    String teacherId;
}

域:

代码语言:javascript
复制
public class School {
    List<Teacher> teachers;
}

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

public class Course {
    String name;
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-11 20:58:05

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

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

代码语言:javascript
复制
@Mapper
public abstract class SchoolMapper {
    public School toSchool(SchoolDto school) {
        return toSchool( school, school.getCourses() );
    }

    protected abstract School toSchool(SchoolDto school, @Context List<CourseDto> courses);

    @Mapping(target = "courses", ignore = true) // see afterMappingToTeacher
    protected abstract Teacher toTeacher(TeacherDto teacher, @Context List<CourseDto> courses);

    protected abstract Course toCourse(CourseDto course);

    @AfterMapping
    void afterMappingToTeacher(@MappingTarget target, TeacherDto source, @Context List<CourseDto> courses) {
        // omitted null-checks

        List<Course> courses = new ArrayList<>();
        for(CourseDto course : courses) {
            if(course.getTeacherId().equals(source.getId())) {
                courses.add( toCourse(course) );
            }
        }

        target.setCourses( courses );
    }
}

(当使用>= 8时,可以使用带有默认方法的接口)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51280962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档