В целом, при использовании JOIN
для материализации графов объектов на самом деле не будет работать, поскольку вы денормализуете свои сущности базы данных в таблицу (с дубликатами), прежде чем пытаться нормализовать данные снова в алгоритме сопоставления. JPA скрывает от вас эти вещи, предлагая альтернативный язык запросов, который не предоставляет столько функций SQL.
В вашем конкретном случае, однако, вы можете получить это для запуска через API jOOQ с помощью методов Result.intoGroups()
. Таким образом:
Map<Record, Result<Record>> result =
dsl.selectFrom(...).fetch().intoGroups(CHEST.fields());
List<Chest> list = new ArrayList<>();
for (Entry<Record, Result<Record>> entry : result.entrySet()) {
Record chest = entry.getKey();
Result<Record> drawers = entry.getValue();
list.add(new Chest(
chest.into(Id.class), // These into(Class<?>) methods assume that you
drawers.into(Drawer.class) // want to use jOOQ's DefaultRecordMapper
));
}
Этот алгоритм, вероятно, неполный или не совсем то, что вам нужно. Но это даст вам общее представление о том, что возможно из коробки через API jOOQ.
Спасибо, Лукас! 'inGroups' кажется мне то, что мне нужно - я отдам его. Я уже реализовал его, используя группировку потоков java: 'stream(). Collect (Collectors.grouping (...))', но способ JOOQ, кажется, определенно лучше, менее шаблонный. – Vlad
@ Vlad: Да, «Стрим» имеет схожие возможности. Конечно, вы можете комбинировать API Java 8 с API-интерфейсами jOOQ. Кстати, мы обнаружили, что Java 8 полностью ограничивает себя при использовании в тестах интеграции jOOQ, поэтому мы создали и открываем исходники [jOOλ] (http://blog.jooq.org/2014/09)./10 /, когда-заместитель Java-8-потоки-апи-это-не-достаточно /). Возможно, мы также добавим некоторые полезные ярлыки для группировки там ... –
Ха-ха, jOOλ - классное имя, похоже на порт Scala's Seq :) Извините за отличную тему. – Vlad