【发布时间】:2014-09-16 18:35:42
【问题描述】:
我使用 JOOQ 查询多对多关系,并且需要将一个条目的多个结果映射到单个对象。为此,我使用唯一标识符将结果分组,并从每个分组结果中提取所需的数据。对于多对多数据,我获取所有可用值,对于普通数据,我只使用第一个条目的数据:
Map<String, Result<Record2<String, String>> groupedResults = create.select(LOC.NAME, GROUP.GROUP_)
.from(LOC)
.leftOuterJoin(LOC2GROUP)
.on(Tables.LOC2GROUP.LOC_ID.eq(LOC.LOC_ID))
.leftOuterJoin(GROUP)
.on(LOC2GROUP.GROUP_ID.eq(GROUP.GROUP_ID))
.fetch().intoGroups(LOC.NAME);
Collection<Loc> ret = new ArrayList<Loc>();
for (Result<Record2<String, String>> result : groupedResults.values()) {
Loc loc = new Loc(result.getValue(0, LOCATION.NAME), result.getValues(Tables.GROUP.GROUP_));
ret.add(loc);
}
现在,虽然每个条目可以有多个组,但它不需要有任何组,以下将是一个有效的条目,只是没有设置任何组:
|name |group |
|simple|{null}|
奇怪的是,我注意到Result.getValues() 在这种情况下会返回一个包含null 的列表,而不是一个空列表。
这是有意的吗?如果是这样,是否有比在获取后删除空条目更好的解决方法?
【问题讨论】:
-
不应该有任何“意外”的空值,但很有可能将您的原始结果分组到
groupedResults将在每个组中产生一个null值。您最初的查询是什么?原始查询在分组之前返回了哪些数据? -
@LukasEder 查询是几个连接的相当复杂的混乱,我在上面添加了一个简化示例。在分组之前,查询将返回如上例 (2) 所示的数据。如果 JOOQ 在这里按预期工作,我假设我唯一能做的就是在之后删除不需要的空值(再次,对于我的内部逻辑,空值意味着“没有组”,它在内部由一个空集合表示)?
标签: sql many-to-many jooq