如何使用multiset与JOOQ获取关联的记录列表?

问题描述 投票:0回答:1

我正在尝试获取记录(参与记录)以及相关记录(与会者)的列表。我想将它们全部存储为记录,但似乎无法让它发挥作用。我在网上看到的所有多重集示例都只使用几个字段而不是整个记录。如果这有区别的话,这也在 Kotlin 中。

请参阅下文,了解我正在尝试执行的操作,但它不起作用。

  context.select(
        ENGAGEMENT_NOTE.asterisk(),
        multiset(
            select()
                .from(ENGAGEMENT_NOTE_ATTENDANCE)
                .join(ENGAGEMENT_NOTE_ATTENDEE).on(ENGAGEMENT_NOTE_ATTENDANCE.ATTENDEE_ID.eq(ENGAGEMENT_NOTE.ID))
                .where(ENGAGEMENT_NOTE_ATTENDANCE.ENGAGEMENT_NOTE_ID.eq(ENGAGEMENT_NOTE.ID))
        ).convertFrom { it.into(ENGAGEMENT_NOTE_ATTENDEE) }
            .`as`("attendees")
    )
        .from(ENGAGEMENT_NOTE)
        .where(ENGAGEMENT_NOTE.ID.eq(noteId.value))
        .fetchOne()
        ?.map {
            EngagementNoteView(
                it.into(ENGAGEMENT_NOTE),
                it.getValue("attendees") as List<EngagementNoteAttendeeRecord> // This is definitely wrong.
            )
        }
kotlin jooq
1个回答
0
投票

使用

selectFrom(Table<R>)
返回
Result<R>
,而不是
select().from(table)

jOOQ 3.19解决方案

即将推出的 jOOQ 3.19 多路径表达式以及隐式路径相关性将使这变得超级简单:

context
    .select(

        // You can use a Table<R> as a SelectField<R>
        ENGAGEMENT_NOTE,
        multiset(

            // jOOQ 3.19 many-to-many implicit join path correlation
            selectFrom(ENGAGEMENT_NOTE.engagementNoteAttendee())
        ).`as`("attendees")
    .from(ENGAGEMENT_NOTE)
    .where(ENGAGEMENT_NOTE.ID.eq(noteId.value))
    .fetchOne()

注意,上面还使用了

Table<R>
作为
SelectField<R>

jOOQ 3.18解决方案

在 jOOQ 3.18 中,多对多路径表达式和隐式路径关联尚不可用,因此您必须手动滚动关联。例如,如果您的 RDBMS 支持关联派生表,您可以使用半连接:

context
    .select(
        ENGAGEMENT_NOTE,
        multiset(
            selectFrom(ENGAGEMENT_NOTE_ATTENDEE)
            .where(ENGAGEMENT_NOTE_ATTENDEE.ID.in(
                select(ENGAGEMENT_NOTE_ATTENDANCE.ATTENDEE_ID)
                .from(ENGAGEMENT_NOTE_ATTENDANCE)
                .where(ENGAGEMENT_NOTE_ATTENDANCE.ENGAGEMENT_NOTE_ID
                    .eq(ENGAGEMENT_NOTE.ID))
            ))
        ).`as`("attendees")
    .from(ENGAGEMENT_NOTE)
    .where(ENGAGEMENT_NOTE.ID.eq(noteId.value))
    .fetchOne()
© www.soinside.com 2019 - 2024. All rights reserved.