【发布时间】: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
【问题讨论】: