大佬教程收集整理的这篇文章主要介绍了加入 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,请注明来意。