我有更简单的示例,其中使用多重集效果很好,但是我现在将它嵌套在 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
,但是我不确定如何以自动方式执行此操作(我似乎找到的只是手动映射每个字段,这是不行的)。
如有任何帮助,我们将不胜感激,谢谢。
执行此操作时,您没有向 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)
当然,您仍然可以更进一步,在映射器中省略反射,并尝试将其建模为类型安全查询。这样,您就可以更加确定该查询在运行时是否正确运行。但这不是你问题的主要问题,所以上面的内容可能已经解决了问题。