如何通过并集使用不同基数的行

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

如何在 jOOQ 中编写以下 SQL 查询?

select row (user1."surname", user1."id") from "user" as user1
union all
select row (user2."id") from "user" as user2

这样做不会编译,因为这两行是

Row2
Row1
,显然它们不是同一类型。

db.select(row(user1.SURNAME, user1.ID)).from(user1)
.unionAll(select(row(user2.ID)).from(user2))
.fetch()

我发现的唯一解决方法是使用

row(Collection<?> values)
,但是似乎必须有更好的方法来做到这一点。

db.select(row(listOf(user1.SURNAME, user1.ID))).from(user1)
.unionAll(select(row(listOf(user2.ID))).from(user2))
.fetch()
java sql postgresql jooq
1个回答
0
投票

问题似乎是“我如何告诉编译器更喜欢可变参数重载

row(SelectField...)
而不是类型重载(例如
row(SelectField, SelectField)
)以摆脱类型安全。

在 Kotlin 中,没有比使用

listOf()
*arrayOf()
(与扩展运算符)更好的方法了,就像在 Java 中一样,你必须使用
List.of()
new SelectField[] { ... }
来告诉编译器使用集合重载,因为如果存在更具体、适用的重载,则编译器始终会降低可变参数重载的优先级。通常,这是所需的行为,因为通常您想要类型安全。

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