jOOQ:从连接返回三个对象的列表

Posted

技术标签:

【中文标题】jOOQ:从连接返回三个对象的列表【英文标题】:jOOQ: returning list of three objects from joins 【发布时间】:2018-09-25 05:08:51 【问题描述】:

这个问题是jOOQ: returning list with join,groupby and count in single object 的扩展,但现在是三个对象而不是两个。

想法

select A.*, B.*, C.*
from A
left join B on B.aId = A.aId
left join C on C.bId = B.bId

具体例子

SelectWhereStep<Record> query = using(configuration())
        .select(Student.STUDENT.fields())
        .select(Volunteermatch.VOLUNTEERMATCH.fields())
        .select(Volunteer.VOLUNTEER.fields())
        .from(Student.STUDENT)
        .leftJoin(Volunteermatch.VOLUNTEERMATCH).on(Volunteermatch.VOLUNTEERMATCH.STUDENTID.eq(Student.STUDENT.STUDENTID))
        .leftJoin(Volunteer.VOLUNTEER).on(Volunteer.VOLUNTEER.VOLUNTEERID.eq(Volunteermatch.VOLUNTEERMATCH.VOLUNTEERID));

如何从查询中获取结果?

【问题讨论】:

不是查询!这只是选择的步骤。您可以将这些数据用于下一个查询,也可以将其提取到对象中。它可以通过 JOOQ 模型列表或您的对象列表。 【参考方案1】:

您在查询结束时缺少fetch() 呼叫。

【讨论】:

【参考方案2】:

假设您可以使用类似“Triple”类的东西(下面我使用Apache Commons 类),并假设您只想要第一个结果:

import org.apache.commons.lang3.tuple.Triple;

Record r = query.fetchAny();
return Triple.of(r.into(VOLUNTEER), r.into(VOLUNTEERMATCH), r.into(STUDENT));

如果你想要多个结果,那么可能是这样的:

query.fetchStream().map(r-> Triple.of(
  r.into(VOLUNTEER), r.into(VOLUNTEERMATCH), r.into(STUDENT) )
).collect(toList());

【讨论】:

以上是关于jOOQ:从连接返回三个对象的列表的主要内容,如果未能解决你的问题,请参考以下文章

从数据库返回的对象列表为空

如何从反应式 MariaDB 连接创建 JOOQ DSLContext

使用 gradle 的 JOOQ 连接池

在 JOOQ 中,如果我直接使用底层连接,我的事务状态是不是保持不变?

将保存不同对象的两个不同列表组合到第三个列表中,将对象作为两个列表的交叉连接

带有嵌套列表的 jOOQ 查询