Java 连接3个表并映射一对多关系

Java 连接3个表并映射一对多关系,java,sql,jooq,Java,Sql,Jooq,如何映射具有一对多关系的记录。“下面说”查询返回每个课程表的课程列表和学生列表,我想查询多个课程表 List<Record> result = sql .select() .from(SCHEUDLE) .innerJoin(COURSE) .on(SCHEDULE.ID.eq(COURSE.SID)) .leftJoin(STUDENT) .on(SCHEDULE.ID.eq(STUDENT.SID)) .where(SCHE

如何映射具有一对多关系的记录。“下面说”查询返回每个课程表的课程列表和学生列表,我想查询多个课程表

List<Record> result = sql
    .select()
    .from(SCHEUDLE)
    .innerJoin(COURSE)
    .on(SCHEDULE.ID.eq(COURSE.SID))
    .leftJoin(STUDENT)
    .on(SCHEDULE.ID.eq(STUDENT.SID))
    .where(SCHEUDLE.ID.in(List.of(10,11,12)))
    .fetch();
如何将记录列表映射到时间表列表,每个时间表都有课程列表和学生列表

将域视为

public class Scheudule{
 String scheuduleName;
 List<Course> courses;
 List<Student> students 
}
jOOQ 3.14之前 从历史上看,jOOQ不提供广泛的对象图映射功能集,建议使用第三方工具(如)来完成此类映射任务

最大的警告是,认为连接(包括左连接)是创建嵌套集合的适当方式是错误的。在您的例子中,连接的课程表和学生表之间存在笛卡尔积,这几乎不可能,更不用说再次执行重复数据消除的效率低下了。如果要使用联接解决此问题,必须至少运行2个查询:

获取计划/课程关系的查询 获取计划/学生关系的查询 在jOOQ 3.14之后 幸运的是,JooQ3.14现在可以解决这些问题了。首先,可以实现更具SQL风格的映射嵌套集合的方法。例如,使用JSON:

列表结果= sql.select jsonEntryscheduleName,SCHEDULE.NAME, jsonEntrycourses,字段 选择jsonarrayagjsonobjectcourse.fields .当然 .whereCOURSE.SID.eqSCHEDULE.ID , jsonEntrystudents,field 选择jsonarrayagjsonobjectstudent.fields fromSTUDENT先生 .where student.SID.eqSCHEDULE.ID .fromSCHEDULE ,其中附表10、11、12 .fetchIntoSchedule.class; 如果在这个查询中调用fetch,将得到一组所需结构的JSON文档。如果您有或在类路径上,jOOQ可以使用这些库将JSON文档映射到您自己的类。他们的映射规则适用

使用XML和JAXB也可以做到这一点

请注意,JSON_ArrayAg将空集聚合为NULL,而不是空[]

未来的jOOQ版本可能会提供此功能,而不依赖于第三方映射库。

jOOQ 3.14之前的版本 从历史上看,jOOQ不提供广泛的对象图映射功能集,建议使用第三方工具(如)来完成此类映射任务

最大的警告是,认为连接(包括左连接)是创建嵌套集合的适当方式是错误的。在您的例子中,连接的课程表和学生表之间存在笛卡尔积,这几乎不可能,更不用说再次执行重复数据消除的效率低下了。如果要使用联接解决此问题,必须至少运行2个查询:

获取计划/课程关系的查询 获取计划/学生关系的查询 在jOOQ 3.14之后 幸运的是,JooQ3.14现在可以解决这些问题了。首先,可以实现更具SQL风格的映射嵌套集合的方法。例如,使用JSON:

列表结果= sql.select jsonEntryscheduleName,SCHEDULE.NAME, jsonEntrycourses,字段 选择jsonarrayagjsonobjectcourse.fields .当然 .whereCOURSE.SID.eqSCHEDULE.ID , jsonEntrystudents,field 选择jsonarrayagjsonobjectstudent.fields fromSTUDENT先生 .where student.SID.eqSCHEDULE.ID .fromSCHEDULE ,其中附表10、11、12 .fetchIntoSchedule.class; 如果在这个查询中调用fetch,将得到一组所需结构的JSON文档。如果您有或在类路径上,jOOQ可以使用这些库将JSON文档映射到您自己的类。他们的映射规则适用

使用XML和JAXB也可以做到这一点

请注意,JSON_ArrayAg将空集聚合为NULL,而不是空[]

未来的jOOQ版本可能会提供此功能,而不依赖于第三方映射库