【问题标题】:jOOQ: returning list with join,groupby and count in single objectjOOQ:在单个对象中返回包含 join、groupby 和计数的列表
【发布时间】:2018-09-15 14:55:40
【问题描述】:

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

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

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

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

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

问题
我在我的函数中找不到要返回的单个对象。我想得到类似 List 的东西。让我通过示例更好地解释这一点,以及为什么它们不适合我。

我尝试了什么 1

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);
}

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

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

【问题讨论】:

    标签: java jooq


    【解决方案1】:

    如此接近!不要使用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())
        );
    

    【讨论】:

    • 太酷了!额外的问题:如果我使用另一个连接并得到三个对象怎么办?那你怎么做呢?
    • @Rico:我很高兴为此回答一个新问题(举例说明“三个对象”的含义)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多