jooq - JOOQ:fetchGroups() 总是返回只有一个元素的列表
问题描述
我是 JOOQ 的新手,目前无法将连接查询映射到Map<K, List<V>>
:列表始终只包含一个元素。
这是我的代码:
DSL.using(...)
.select(ORDER.fields())
.select(ORDER_ITEM_ARTICLE.fields())
.from(ORDER)
.leftOuterJoin(ORDER_ITEM_ARTICLE).on(ORDER.ID.eq(ORDER_ITEM_ARTICLE.ORDER_ID))
// to Map<InOutOrder, List<OrderItemArticle>>
.fetchGroups(
r -> r.into(ORDER).into(InOutOrder.class),
r -> r.into(ORDER_ITEM_ARTICLE).into(OrderItemArticle.class)
)
// map to InOutOrder
.entrySet().stream().map( e -> {
// e.getValue() always returns list with only 1 element?!
e.getKey().articles = e.getValue();
return e.getKey();
})
.collect(Collectors.toList())
;
假设我有 1 行ORDER
和 2 对应的行ORDER_ITEM_ARTICLE
。.getSQL()
运行(after ) 返回的 SQL .fetchGroups()
,按预期返回 2 行,所以我假设该fetchGroups()
调用也会用两个条目填充我的列表?!
我错过了什么?
谢谢!
更新:
根据要求,InOutOrder
班级:
public class InOutOrder extends Order {
public List<OrderItemArticle> articles;
public List<OrderItemOther> others;
public List<OrderItemCost> costs;
public List<OrderContact> contacts;
public List<EmailJob> emailJobs;
}
所以这只是 JOOQ POJO 类的扩展,用于与 API 客户端进行 JSON 通信......
解决方案
fetchGroups()
简单地将对象放在一个LinkedHashMap
. 您必须遵守通常的Map
合同,这意味着实施equals()
和hashCode()
。没有它,您正在创建的每个对象(或为您创建的 jOOQ)都将使用身份比较,因此您只能在结果中获得每个“值”一次。
推荐阅读
- r - 所有函数仅检查 R 中向量的最后一个元素
- javascript - 使用 Gsuite 在 Node.js 中创建和发送自动生成的电子邮件
- visual-studio - 类型 Task<> 存在于 Unity.Tasks 和 mscorelib 中(Unity 问题)
- python - 我如何将变量传递给谷歌云函数
- plot - 如何在 wxmaxima 2d 图中互换主轴和次轴
- out-of-memory - Pytorch RuntimeError:CUDA out of memory when training graph attention network
- javascript - jQuery .text() 方法不显示索引项值
- c++ - 使用 For 循环将一个字符串复制到另一个字符串
- python - 如何在 PyCharm 中定位模块?
- python - 如何仅将 csv 文件中的某个列复制到 sqlite 数据库表中?