You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SimpleFlatMapper处理POJO中的多个1-N关联关系?

使用SimpleFlatMapper处理POJO中多个1-N关联关系的提取

当POJO包含多个一对多关联集合(比如StudentDTO同时包含books和courses两个集合属性)时,可通过以下步骤用SimpleFlatMapper实现关联数据的正确提取:

1. 明确DTO结构

先定义主DTO和子DTO的结构(子DTO需包含与主DTO关联的外键字段):

import java.util.List;

// 主实体DTO
public class StudentDTO {
    private Long id;
    private String name;
    private List<BookDTO> books;
    private List<CourseDTO> courses;
    // Getter、Setter方法省略
}

// 书籍子DTO
public class BookDTO {
    private Long id;
    private String title;
    private Long studentId;
    // Getter、Setter方法省略
}

// 课程子DTO
public class CourseDTO {
    private Long id;
    private String name;
    private Long studentId;
    // Getter、Setter方法省略
}

2. 编写带别名的查询SQL

为避免不同实体的字段名称冲突,查询结果集需用别名区分各实体字段,且必须按主实体主键排序(这是SimpleFlatMapper正确合并集合的前提):

SELECT 
    s.id AS student_id,
    s.name AS student_name,
    b.id AS book_id,
    b.title AS book_title,
    c.id AS course_id,
    c.name AS course_name
FROM student s
LEFT JOIN book b ON s.id = b.student_id
LEFT JOIN course c ON s.id = c.student_id
ORDER BY s.id

3. 配置Mapper并映射结果

通过JdbcMapperFactory为每个关联集合分别指定唯一的关联键组合,实现多组一对多关系的正确合并:

// 构建JdbcMapper实例
JdbcMapper<StudentDTO> mapper = 
    JdbcMapperFactory.newInstance()
        // 指定主实体StudentDTO的主键(用于识别唯一学生)
        .addKeys("student_id")
        // 指定books集合的关联键:学生ID+书籍ID(用于识别唯一书籍)
        .addKeys("student_id", "book_id")
        // 指定courses集合的关联键:学生ID+课程ID(用于识别唯一课程)
        .addKeys("student_id", "course_id")
        // 若SQL别名与DTO属性名不匹配,手动添加映射关系
        .addMapping("student_id", "id")
        .addMapping("student_name", "name")
        .addMapping("book_title", "books.title")
        .addMapping("course_name", "courses.name")
        .newMapper(StudentDTO.class);

// 执行查询并转换结果
try (ResultSet rs = yourPreparedStatement.executeQuery()) {
    List<StudentDTO> studentList = mapper.asList(rs);
}

核心注意事项

  • 关联键唯一性:每个子集合的关联键组合必须能唯一标识子实体(比如student_id + book_id确保每本书的唯一性),否则会出现数据合并错误。
  • 结果集排序:必须按主实体主键排序,否则SimpleFlatMapper会重复创建主实体对象。
  • 字段映射:若SQL字段别名与DTO属性名不一致,需通过addMapping手动指定映射路径(如"book_title"对应"books.title")。

内容的提问来源于stack exchange,提问作者localhost

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:43:14