如何用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
相关产品推荐
相关产品推荐

