映射嵌套记录时 jOOQ 的转换器问题

Converter issue with jOOQ when mapping nested records

我有两个基本相同的查询,一个使用 multiset,另一个使用 row,但它们在从 SQL 数据类型转换为 Java/Kotlin 时表现不同.

例如,这里是 multiset:

multiset(
    select(
        CALENDAR_ENTRIES.ID,
        CALENDAR_ENTRIES.EVENT_DATE
    )
        .from(CALENDAR_ENTRIES)
        .where(cond)
).`as`("calendar_entry")
    .convertFrom { r: Result<Record2<Long, LocalDateTime>> ->
        r.map(
            Records.mapping { id: Long?, eventDate: LocalDateTime? ->
                CalendarEntry(id, eventDate!!)
            }
        )
    }

这里是 row:

row(
    CALENDAR_ENTRIES.ID,
    CALENDAR_ENTRIES.EVENT_DATE
)
    .mapping { id: Long?, eventDate: LocalDateTime ->
        CalendarEntry(id, eventDate)
    }

为了论证,假设数据库有 1 条记录,eventDate 是(作为字符串) '2022-02-21 09:30:00'.

通过第一个查询,我成功获得了我的 Field<List<CalendarEntry>> 实例。对于第二个查询 (row()),我得到“java.time.format.DateTimeParseException:无法在索引 10 处解析文本 '2022-02-21 09:30:00'”。

jOOQ 似乎能够正确地为 multiset 调用应用转换器,但不能为 row 调用应用转换器。我做错了什么吗?

我假设您使用的是 PostgreSQL。

您可能 运行 遇到了这里的错误:https://github.com/jOOQ/jOOQ/issues/13117。从 jOOQ 3.16 开始,可以解释行为上的差异:

  • MULTISET 使用 JSONB 功能进行模拟
  • ROW 获得
    • 嵌套在 multiset
    • 中时使用 JSONB 功能模拟
    • 在顶级使用时使用 PostgreSQL ROW 表达式本机实现

错误 https://github.com/jOOQ/jOOQ/issues/13117 似乎也影响顶级 ROW 类型,而不仅仅是 UDT。它最近已修复,可能会反向移植到 3.16 和 3.15。