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
相关产品推荐
相关产品推荐

