JOOQ:fetchGroups() 总是 returns 列表只有一个元素

JOOQ: fetchGroups() always returns list with only one element

我是 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())
            ;

假设我在 ORDER 中有 1 行,在 ORDER_ITEM_ARTICLE 中有 2 行对应的行。 运行 .getSQL() 返回的 SQL(在 .fetchGroups() 之后),returns me 2 rows as expected,所以我假设 fetchGroups() 调用将填充我的列表也有两个条目?!

我错过了什么?

谢谢!


更新:

根据要求,InOutOrder class:

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 class 的扩展,用于 JSON 与 API 客户端的通信...

fetchGroups() 只是将对象放在 LinkedHashMap 中。您必须遵守通常的 Map 合同,这意味着实施 equals()hashCode()。没有它,你正在创建的每个对象(或者 jOOQ 正在为你创建的对象)将使用身份比较,所以你在结果中只得到每个 "value" 一次。