程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了加入 jOOQ大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决加入 jOOQ?

开发过程中遇到加入 jOOQ的问题如何解决?下面主要结合日常开发的经验,给出你关于加入 jOOQ的解决方法建议,希望对你解决加入 jOOQ有所启发或帮助;

我有三个表:event、speaker、event_speaker

事件和发言人有 n:m 关系,由“event_speaker”表管理。我使用 jOOQ maven 代码生成器生成“EventRecord”和“SpeakerRecord”等文件。

在我的应用程序中,我希望获得特定活动的所有发言人。所以我需要将“speaker”表与“event_speaker”表连接起来,以便能够通过事件ID来限制结果:

return dsl.select(SPEAKER.asterisk())
        .from(SPEAKER)
        .leftJoin(EVENT_SPEAKER).on(SPEAKER.ID.eq(EVENT_SPEAKER.SPEAKER_ID))
        .where(EVENT_SPEAKER.EVENT_ID.eq(eventID))
        .fetch();

现在我将获得一个 Result<Record> 作为返回值。但我想得到一个 Result<SpeakerRecord> 作为返回值。如果我删除连接,我会得到它(但当然结果集将包含我不想要的所有扬声器)。

当我需要连接时,如何用 SpeakerRecord 代替更通用的 Record 对象?

解决方法

您可以使用 fetchInto 告诉 jOOQ 您期望的结果:

return dsl.select(SPEAKER.fields())
    .from(SPEAKER)
    .leftJoin(EVENT_SPEAKER).on(SPEAKER.ID.eq(EVENT_SPEAKER.SPEAKER_ID))
    .where(EVENT_SPEAKER.EVENT_ID.eq(eventId))
    .fetchInto(SpeakerRecord.class);
,

Your LEFT JOIN is effectively an INNER JOIN 因为您的 WHERE 子句过滤了外部联接表 but what you really wanted was a semi join。在极少数情况下,您在 EVENT_SPEAKER (SPEAKER_ID,EVENT_ID) 上没有唯一键,例如因为键中有第三列,所以您的当前查询会出现重复项。

所以,改为这样做:

return dsl
    .selectFrom(SPEAKER)
    .where(SPEAKER.ID.in(
        select(EVENT_SPEAKER.SPEAKER_ID)
        .from(EVENT_SPEAKER)
        .where(EVENT_SPEAKER.EVENT_ID.eq(eventId))
    ))
    .fetch();

假设,一如既往

import static org.jooq.impl.DSL.*;

通过上述查询,您可以再次使用 DSLContext.selectFrom(Table),从而生成您想要的 SpeakerRecord

在您确实需要加入的其他情况下,use Simon's approach

大佬总结

以上是大佬教程为你收集整理的加入 jOOQ全部内容,希望文章能够帮你解决加入 jOOQ所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: