gpt4 book ai didi

java - jOOQ:在单个对象中返回带有 join、groupby 和 count 的列表

转载 作者:行者123 更新时间:2023-11-30 06:13:45 24 4
gpt4 key购买 nike

核心问题:如何正确地将查询中的信息提取到对象中?

想法
我正在 DAO 中创建函数,这可以归结为以下查询:

select A.*, count(*)
from A
left join B on B.aId = A.aId
group by A.*

我正在寻找一种创建 jOOQ 表达式的方法,该表达式只为我提供一个包含对象 A (pojo) 和 Integer 的列表(或我可以循环的内容)。

具体案例
在我的代码案例中:A = Volunteer 和 B = VolunteerMatch,我为每个志愿者存储多个匹配项。 B 将 (volunteerId,volunteerMatchId) 作为主要 key 。因此,此查询会产生来自志愿者的信息以及匹配的数量。显然,这可以通过两个单独的查询来完成,但我想将其作为一个查询来完成!

问题
我找不到要在函数中返回的单个对象。我正在尝试获取类似 List 的内容。让我用示例更好地解释这一点以及为什么它们不适合我。

我尝试了什么

SelectHavingStep<Record> query = using(configuration())
.select(Volunteer.VOLUNTEER.fields())
.select(Volunteermatch.VOLUNTEERMATCH.VOLUNTEERID.count())
.from(Volunteer.VOLUNTEER)
.leftJoin(Volunteermatch.VOLUNTEERMATCH).on(Volunteermatch.VOLUNTEERMATCH.VOLUNTEERID.eq(Volunteer.VOLUNTEER.VOLUNTEERID))
.groupBy(Volunteer.VOLUNTEER.fields());

Map<VolunteerPojo, List<Integer>> map = query.fetchGroups(
r -> r.into(Volunteer.VOLUNTEER).into(VolunteerPojo.class),
r -> r.into(Volunteermatch.VOLUNTEERMATCH.VOLUNTEERID.count()).into(Integer.class)
);

问题在于我从整数创建了一个列表。但这不是我想要的,我想要一个整数(计数将始终返回一行)。注意:我不想要“只需创建自己的没有列表的 map ”的解决方案,因为我的直觉告诉我 jOOQ 中有一个解决方案。我是来学习的!

我尝试过的2

SelectHavingStep<Record> query = using(configuration())
.select(Volunteer.VOLUNTEER.fields())
.select(Volunteermatch.VOLUNTEERMATCH.VOLUNTEERID.count())
.from(Volunteer.VOLUNTEER)
.leftJoin(Volunteermatch.VOLUNTEERMATCH).on(Volunteermatch.VOLUNTEERMATCH.VOLUNTEERID.eq(Volunteer.VOLUNTEER.VOLUNTEERID))
.groupBy(Volunteer.VOLUNTEER.fields());

Result<Record> result = query.fetch();
for (Record r : result) {
VolunteerPojo volunteerPojo = r.into(Volunteer.VOLUNTEER).into(VolunteerPojo.class);
Integer count = r.into(Volunteermatch.VOLUNTEERMATCH.VOLUNTEERID.count()).into(Integer.class);
}

但是,我不想在代码中返回结果对象。在我调用此函数的每个地方,我都调用 r.into(...).into(...)。在编译时,如果它返回一个整数或一个真实的 pojo,则不会给出错误。我不希望这会防止将来出现错误。但至少我认为它没有在列表中给出它。

推理
这两种选择可能都不错,但我感觉文档中遗漏了一些更好的东西。也许我可以调整(1)以不获取整数列表。也许我可以将 Result 更改为 Result 之类的内容,以指示真正返回的对象。每个问题都有一个解决方案就好了,因为我越来越多地使用 jOOQ,这将是一个很好的学习体验!

最佳答案

如此接近!不要使用ResultQuery.fetchGroups() 。使用ResultQuery.fetchMap()相反:

Map<VolunteerPojo, Integer> map =
using(configuration())
.select(VOLUNTEER.fields())
.select(VOLUNTEERMATCH.VOLUNTEERID.count())
.from(VOLUNTEER)
.leftJoin(VOLUNTEERMATCH)
.on(VOLUNTEERMATCH.VOLUNTEERID.eq(VOLUNTEER.VOLUNTEERID))
.groupBy(VOLUNTEER.fields())
.fetchMap(
r -> r.into(VOLUNTEER).into(VolunteerPojo.class),
r -> r.get(VOLUNTEERMATCH.VOLUNTEERID.count())
);

关于java - jOOQ:在单个对象中返回带有 join、groupby 和 count 的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49678222/

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