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版本可能会提供此功能,而不依赖于第三方映射库