我正在try 获取记录(参与记录),以及相关记录(参与者)的列表.我想将它们全部存储为记录,但似乎无法使其工作.我在网上看到的所有MultiSet的例子都只使用了几个字段,而不是整个记录.这在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.
            )
        }

推荐答案

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

JOOQ 3.19解决方案

即将推出的jOOQ 3.19 to-many path expressionsimplicit path correlations将使这一点变得超级简单:

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> as a 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()

Kotlin相关问答推荐

Lambda和普通Kotlin函数有什么区别?

如何在Jetpack Compose中的列中渲染图像

如何将时间值格式化为00:00和00:00:00 Kotlin?""""

Kotlin 海峡没有结束

可以从背景图像中点击图标吗?

Kotlin - 如何避免在密封类的 when() 语句中转换第二个变量

顶级属性的初始化

如何使用 Hilt 注入应用程序:ViewModel 中的上下文?

如何为 material.Slider 视图创建绑定适配器?

Kotlin 1.2.21 + SimpleXml 2.3.0 - consume List error (must mark set get method)

什么是 .kotlin_builtins 文件,我可以从我的 uberjars 中省略它们吗?

模拟异常 - 没有找到答案

Kotlin 是如何编译的?

TextField maxLength - Android Jetpack Compose

变量后的Android问号

Kotlin suspend fun

如何从kotlin中的类实例化对象

类型不匹配推断类型为单位,但应为空

Kotlin中保留的关键字是什么?

将字符串编码为Kotlin中的UTF-8