首页 > 解决方案 > jOOQ fetchInto 无法将 java.util.LinkedHashMap 转换为类

问题描述

如本相关问题中所述,我想使用 jOOQ (3.14.4) 将结果集映射到使用fetchInto.

我有以下 SQL 表:USERUSER_TO_ROLEROLE类似于此答案中假定的上下文)。此外,我使用具有以下 Jackson 依赖项的 PostgreSQL 13.1(具有jacksonVersion="2.11.3"

implementation("com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonVersion")
implementation("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion")

根据文档,以下 Kotlin 片段应将用户及其角色映射到给定的 Kotlin 类:

val select = mutableListOf<SelectField<out Any?>>(USER.ID, USER.USERNAME)
select.add(
    field(
        select(
            jsonArrayAgg(
                jsonObject(
                    jsonEntry("id", ROLE.ID),
                    jsonEntry("name", ROLE.NAME),
                )
            )
        )
            .from(ROLE)
            .join(USER_TO_ROLE).on(ROLE.ID.eq(USER_TO_ROLE.ROLE_ID))
            .where(USER_TO_ROLE.user().ID.eq(USER.ID))
    ).`as`("roles")
)

return dsl.select(select)
    .from(USER)
    .where(USER.ID.eq(id))
    .fetchInto(User::class.java)

其中UserRole定义为:

data class User(
    var id: UUID? = null,
    var username: String? = null,
    var roles: List<Role>? = null,
)

data class Role(
    var id: UUID? = null,
    var name: String? = null,
)

不幸的是,这会产生以下异常(当用户与角色相关联时):

无法从 {id=<UUID>, name=<String>}(java.util.LinkedHashMap 类)转换为 com.example.demo.Role 类

我认为添加杰克逊会解决前面提到的相关问题中提出的问题,但事实并非如此。

我错过了什么吗?

可以在这里找到一个最小的示例项目

标签: kotlinjacksonjooq

解决方案


推荐阅读