JOOQ Multiset 将以 json 数组而不是 Record 的形式返回

问题描述 投票:0回答:1

我有更简单的示例,其中使用多重集效果很好,但是我现在将它嵌套在 CTE 中,而 JOOQ 似乎将其转换为数组而不是将其保留为记录。

这是我所能得到的最简单的例子:

    val table = DSL.select(
        PROXY_VOTE.asterisk(),
        multiset(
            DSL.selectFrom(TAG)
                .where(TAG.PROXY_VOTE_ID.eq(PROXY_VOTE.ID))
        )
            .`as`("tags"),
    )
        .from(PROXY_VOTE)


    val cte = with("cte").`as`(table)
        .select(
            asterisk(),
            DSL.count().over().`as`("total_count")
        ).from(name("cte"))

    val results = this
        .with("cte2").`as`(cte)
        .select()
        .from("cte2")
        .fetch()

如果您这样做:

results.first().getValue("tags", List::class.java)

您会看到返回的是 json 数组而不是

TagRecord
。我不介意自己将它们转换回
TagRecord
,但是我不确定如何以自动方式执行此操作(我似乎找到的只是手动映射每个字段,这是不行的)。

如有任何帮助,我们将不胜感激,谢谢。

java kotlin jooq
1个回答
0
投票

执行此操作时,您没有向 jOOQ 提供有关查询所涉及类型的任何信息:

select(
    asterisk(),
    DSL.count().over().`as`("total_count")
).from(name("cte"))

问题是您的

cte
是使用
name("cte")
引用的,虽然 jOOQ 原则上可以尝试从
WITH
子句查找此表,但事实并非如此。但为什么不明确提供呢?

val cte = DSL.name("cte").as(DSL.select(
    PROXY_VOTE.asterisk(),
    multiset(
        DSL.selectFrom(TAG)
            .where(TAG.PROXY_VOTE_ID.eq(PROXY_VOTE.ID))
    )
        .`as`("tags"),
)
    .from(PROXY_VOTE))

val cte = with(cte)
    .select(
        asterisk(),
        DSL.count().over().`as`("total_count")
    ).from(cte)

当然,您仍然可以更进一步,在映射器中省略反射,并尝试将其建模为类型安全查询。这样,您就可以更加确定该查询在运行时是否正确运行。但这不是你问题的主要问题,所以上面的内容可能已经解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.