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