gpt4 book ai didi

java - 带嵌套列表的 jOOQ 查询

转载 作者:行者123 更新时间:2023-12-02 02:52:33 25 4
gpt4 key购买 nike

jOOQ 可以将查询结果映射到 POJO 中的多个嵌套列表吗?例如,我有一个POJO VM,它代表一个虚拟机。它有一个“networks”属性,它是一个网络类型的列表。它还具有“hdds”属性,它是“HDD”类型的列表。该查询连接 VM、HDD 和网络表。我可以直接“获取”VM.class 并期望 jOOQ “做正确的事情”吗?

最佳答案

在 jOOQ 3.15 中使用 MULTISET

从 jOOQ 3.15 开始,这里的首选方法是使用 MULTISET 。假设您有:

record Vm(String name, List<Network> networks, List<Hdd> hdds) {}

你可以写

List<Vm> result =
ctx.select(
VM.NAME,
multiset(
select(
// Using implicit joins can help here, though entirely optional
NETWORK_TO_VM.network().ID,
NETWORK_TO_VM.network().NAME)
.from(NETWORK_TO_VM)
.where(NETWORK_TO_VM.VM_ID.eq(VM.VM_ID))
).convertFrom(r -> r.map(Records.mapping(Network::new))),
multiset(
select(
HDD_TO_VM.hdd().ID,
HDD_TO_VM.hdd().NAME)
.from(HDD_TO_VM)
.where(HDD_TO_VM.VM_ID.eq(VM.VM_ID))
).convertFrom(r -> r.map(Records.mapping(Hdd::new)))
)
.from(VM)
.fetch(Records.mapping(Vm::new));

请注意,上述方法正在组合:

所有这些都是为了确保您可以直接从 SQL 查询中键入检查对象层次结构,从而一次性获取所有数据。

在 jOOQ 3.14 中使用 SQL/XML 或 SQL/JSON 嵌套集合

从 jOOQ 3.14 开始,这里的一个选项是 use SQL/XML or SQL/JSON to nest collections directly in SQL 。例如:

class Vm {
String name;
List<Network> networks;
List<Hdd> hdds;
}

现在,你可以写:

List<Vm> result =
ctx.select(
VM.NAME,
field(
select(jsonArrayAgg(jsonObject(
key("id").value(NETWORK.ID),
key("name").value(NETWORK.NAME),
// ...
)))
.from(NETWORK)
.join(NETWORK_TO_VM).on(NETWORK.NETWORK_ID.eq(NETWORK_TO_VM.NETWORK_ID))
.where(NETWORK_TO_VM.VM_ID.eq(VM.VM_ID))
).as("networks"),
field(
select(jsonArrayAgg(jsonObject(
key("id").value(HDD.ID),
key("name").value(HDD.NAME),
// ...
)))
.from(HDD)
.join(HDD_TO_VM).on(HDD.HDD_ID.eq(HDD_TO_VM.HDD_ID))
.where(HDD_TO_VM.VM_ID.eq(VM.VM_ID))
).as("hdds")
)
.from(VM)
.fetchInto(Vm.class);

请注意,JSON_ARRAYAGG() 将空集聚合到 NULL 中,而不是聚合到空的 [] 中。 If that's a problem, use COALESCE()

历史性答案(jOOQ 3.14 之前)

此类映射功能在像 jOOQ 这样的库中只能在有限范围内实现的主要原因是,通过连接表和反规范化结果,jOOQ 不再具有正确删除顶级元组的所需信息(VM 在你的情况下)。实现 JPA 的流行 ORM 不受此限制,因为它们不允许您表达任意连接。

但是您有一定的可能性将非规范化结果集映射到嵌套集合中:

关于java - 带嵌套列表的 jOOQ 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32332729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com