JOOQ: fetchGroups () всегда возвращает список только с одним элементом - PullRequest
2 голосов
/ 12 февраля 2020

Я новичок в 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. Выполнение SQL, возвращаемого .getSQL() (после .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 и используется для JSON связи с клиентами API ...

1 Ответ

0 голосов
/ 12 февраля 2020

fetchGroups() просто помещает объекты в LinkedHashMap. Вы должны придерживаться обычного Map контракта, что означает реализацию equals() и hashCode(). Без этого каждый объект, который вы создаете (или который JOOQ создает для вас), будет использовать сравнение идентичности, поэтому вы получаете каждое «значение» только один раз в результате.

...