2014-12-22 2 views
2

Предположим, у меня есть модель, как следующийКаков наилучший способ чтения вложенного объекта из объединяющего запроса

class Chest { 
    public Id id; 
    public List<Drawer> drawers; 
    public Price price; 
} 

class Drawer { 
    public Id id; 
    public Price price; 
} 

И запрос JOOQ принести объект Сундук с его Тумбы:

dsl.selectFrom(CHEST.join(DRAWERS).onKey()).where(CHEST.ID.eq(1)).fetch() 

Каков наилучший способ создания объекта Chest из результата запроса выше?

Спасибо.

ответ

1

В целом, при использовании 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.

+0

Спасибо, Лукас! 'inGroups' кажется мне то, что мне нужно - я отдам его. Я уже реализовал его, используя группировку потоков java: 'stream(). Collect (Collectors.grouping (...))', но способ JOOQ, кажется, определенно лучше, менее шаблонный. – Vlad

+0

@ Vlad: Да, «Стрим» имеет схожие возможности. Конечно, вы можете комбинировать API Java 8 с API-интерфейсами jOOQ. Кстати, мы обнаружили, что Java 8 полностью ограничивает себя при использовании в тестах интеграции jOOQ, поэтому мы создали и открываем исходники [jOOλ] (http://blog.jooq.org/2014/09)./10 /, когда-заместитель Java-8-потоки-апи-это-не-достаточно /). Возможно, мы также добавим некоторые полезные ярлыки для группировки там ... –

+0

Ха-ха, jOOλ - классное имя, похоже на порт Scala's Seq :) Извините за отличную тему. – Vlad