当前位置: 首页 > 知识库问答 >
问题:

jOOQ:在单个对象中返回包含连接、分组和计数的列表

秦彦君
2023-03-14

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

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

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

我正在寻找一种方法来创建一个jOOQ表达式,它只给我一个列表(或者一些我可以循环的东西),对象是A(pojo)和整数。

具体案例
在我的代码案例中:A=志愿者和B=志愿者匹配,我为每个志愿者存储几个匹配。B的主键是(自愿ID,自愿MatchId)。因此,这个查询会得到志愿者的信息以及匹配的数量。显然,这可以在两个单独的查询中完成,但我想把它作为一个查询来做!

问题
我找不到一个对象返回我的函数。我想得到像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)
        );

问题是我用整数创建了一个列表。但这不是我想要的,我想要一个整数(计数将始终返回一行)。注意:我不想要解决方案“只创建自己的地图而不列出”,因为我的直觉告诉我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);
}

但是,我不想在代码中返回result对象。在我调用这个函数的每个地方,我都在调用r.into(…)。变成(…)。在编译期间,如果返回整数或实pojo,则不会出现错误。我不希望这样做可以防止将来出现错误。但至少我想它没有列在清单上。

推理
任一选项可能都没问题,但是我有一种感觉,我在留档中错过了更好的东西。也许我可以适应(1)不要得到整数列表。也许我可以改变结果

共有1个答案

苍阳成
2023-03-14

如此接近!不要使用ResultQuery.fetch组()。使用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())
    );
 类似资料:
  • 这个问题是jOOQ的扩展:在单个对象中返回带有join、groupby和count的列表,但现在返回的是三个对象,而不是两个。 主意 具体示例 如何从查询中获取结果?

  • 好日子,我被困在弄清楚如何从列表中获取单个对象,我做了谷歌,但所有主题都显示了如何返回带有排序对象或类似内容的。 我有一个 在java中,我会这样写 我怎样才能在kotlin中获得同样的结果?

  • 我使用Nodejs,有一个对象包含一个object数组(API请求的结果)和一个简单的值数组。 它们看起来是这样的: 如何将包含对象数组的对象与简单数组进行比较? 我要找的是,从简单数组中获取ID,并将它们与另一个“复杂”对象进行比较,以检索属性以及简单数组中的相应ID和另一个对象属性,然后将结果存储在一个对象数组中。 简单来说,我希望有这样的结果: 当从API请求中检索“复杂”对象时,我尝试了以

  • 我希望在每个数组中获取多个对象,但我的代码显示了单个对象的操作。下面是我的PHP代码,我如何添加另一个循环来获取多个对象 这是显示单个物体的结果

  • 问题内容: 以下是gcc 4.4.4下的简单代码段错误 将最后一行更改为 工作良好。使用编译时,这两个版本均可使用。我是在简单地调用未定义的行为,还是在标准中进行了某些更改,从而使代码可以在C99下工作?为什么在C89下崩溃? 问题答案: 我相信C89 / C90和C99中的行为均未定义。 是数组类型的表达式,特别是。 C99 6.3.2.1p3说: 除非它是 sizeof 运算符或一元 & 运算

  • 问题内容: 好的,所以我试图从我用来学习Java的书中进行练习。这是我到目前为止的代码: 以下是确切措词的练习: 修改类Calculator.java,以将所有数字按钮保留在声明为10个元素的数组中,如下所示: 替换从10开始的行 带有创建按钮并将其存储在此数组中的循环。 好的,所以我尝试使用声明数组,但这给了我错误: 这行有多个标记- 按钮无法解析为类型- 按钮无法解析为类型 相反,我尝试了这个