You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jOOQ嵌套类映射疑问:用row还是field?执行报错求助

嵌套类映射错误修复方案

错误原因

你用row()包裹了单个字段的子查询,但row()是用来构造多列的行记录类型,数据库无法将单个标量值识别为行类型,因此抛出读取字段的错误。

正确写法分两种场景

场景1:Inner类仅包含单个属性(如NAME)

用field()包裹标量子查询,直接映射到Inner类:

.select(
    Tables.Outer.NAME,
    Tables.Outer.Inner_FK,
    field(
        select(Tables.Inner.NAME)
            .from(Tables.Inner)
            .where(Tables.Inner.ID.eq(Tables.Outer.Inner_FK))
    ).mapping(Inner::class.java)
)
.from(Tables.Outer)
.where(Tables.Outer.ID.eq(id))
.fetchOneInto(Outer::class.java)

场景2:Inner类包含多个属性

如果Inner需要多个字段,用row()包裹多个字段(建议用关联查询替代子查询更高效):

.select(
    Tables.Outer.NAME,
    Tables.Outer.Inner_FK,
    row(
        Tables.Inner.ID,
        Tables.Inner.NAME
    ).mapping(Inner::class.java)
)
.from(Tables.Outer)
.join(Tables.Inner).on(Tables.Inner.ID.eq(Tables.Outer.Inner_FK))
.where(Tables.Outer.ID.eq(id))
.fetchOneInto(Outer::class.java)

row与field的核心区别

  • field():处理单个标量值,对应单字段的映射场景。
  • row():处理多字段组成的行记录,对应嵌套类包含多个属性的场景。

内容的提问来源于stack exchange,提问作者Guilherme Melo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 03:34:57