映射嵌套记录时 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。
我有两个基本相同的查询,一个使用 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 中时使用
- 在顶级使用时使用 PostgreSQL
ROW
表达式本机实现
JSONB
功能模拟
错误 https://github.com/jOOQ/jOOQ/issues/13117 似乎也影响顶级 ROW
类型,而不仅仅是 UDT。它最近已修复,可能会反向移植到 3.16 和 3.15。