在 jOOQ 3.14 之前
从历史上看,jOOQ 不提供广泛的对象图映射功能,因此建议使用诸如 SimpleFlatMapper 之类的第三方工具来完成此类映射任务。
最大的警告是认为连接(包括左连接)是创建嵌套集合的适当方式是错误的。在您的情况下,连接的 COURSE 和 STUDENT 表之间存在笛卡尔积,这几乎不可能(更不用说效率低下)再次进行重复数据删除。如果你想用连接解决这个问题,你必须运行至少 2 个查询:
- 获取
SCHEDULE / COURSE 关系的查询
- 获取
SCHEDULE / STUDENT 关系的查询
jOOQ 3.14 之后
幸运的是,jOOQ 3.14 现在可以解决这些问题。从jOOQ 3.14's SQL/XML and SQL/JSON support 开始,可以实现一种更加SQL 风格的映射嵌套集合的方法。例如,使用 JSON:
List<Schedule> result =
sql.select(
jsonEntry("scheduleName", SCHEDULE.NAME),
jsonEntry("courses", field(
select(jsonArrayAgg(jsonObject(COURSE.fields())))
.from(COURSE)
.where(COURSE.SID.eq(SCHEDULE.ID))
)),
jsonEntry("students", field(
select(jsonArrayAgg(jsonObject(STUDENT.fields())))
.from(STUDENT)
.where(STUDENT.SID.eq(SCHEDULE.ID))
))
)
.from(SCHEDULE)
.where(SCHEDULE.ID.in(10, 11, 12))
.fetchInto(Schedule.class);
如果您在此查询中调用fetch(),您将获得一组具有所需结构的JSON 文档。如果您的类路径中有Jackson 或Gson,jOOQ 的DefaultConverterProvider 可以使用这些库将JSON 文档映射到您自己的类。它们的映射规则适用。
使用 XML 和 JAXB 也可以做到这一点。
请注意,JSON_ARRAYAGG() 将空集聚合到 NULL,而不是空集 []。 If that's a problem, use COALESCE()
注意
未来的 jOOQ 版本可能会在不依赖第三方映射库的情况下提供此功能。