2010-01-13 3 views
2

Я пытаюсь добавить некоторые новые функции в существующее приложение, использующее iBatis, но я немного застрял в одном из дизайнерских решений.iBatis - Header Detail Вопрос

Существует существующий класс (назовите его классом A), к которому я хочу добавить новые поля. Эти поля будут типа B.

Запрос будет соединяться B через внешнее соединение.

Так что это будет что-то вроде

public class A { 

    //... existing fields 
    private List<B> bList; // may use a Map rather than a list? 

    // etc. 
} 

public class B { 
    private int id; // primary key 
    private int type; 
    private String description; 

    // etc. 

}

Я использую это в веб-приложение. На первой странице я хочу вернуть список «A», а затем поместить ссылки рядом с B.

Например:

LinktoRecordA1 - LinktoB1 LinktoB2 LinktoB3 
LinktoRecordA2 - LinktoB1   LinktoB3 
LinktoRecordA3 - LinktoB1 LinktoB2 LinktoB3 
LinktoRecordA4 

т.д.

(NB: Запись A4 не имеет никаких связей с какой-либо Б - отсюда и внешнее соединение упомянутых выше)

В начальной выборки из «А-х », Я только хочу знать, что существует запись B, и что это первичный ключ, чтобы представить ссылку до записи B. Итак, моя проблема: как мне это сделать, не создавая полностью заполненный список «B» на объекте «A»?

+0

Из вашего примера я понимаю, что вам нужно отображать ссылки для A и, кроме них, связанные ссылки B. Итак, почему вы получаете полный A, когда вы только после полей ID (идентификаторы A и ID из B)? – 2010-01-15 12:22:17

+0

Hi dpb, Я думаю, что именно там я ошибаюсь. Как еще я должен это делать? Я думаю, что у меня возникла проблема с пониманием этого вопроса - должен ли я возвращать список объектов «А» с минимальными заполненными данными или мне нужно создать какой-то новый объект? –

ответ

0

Что касается Вашего комментария:

How else should I do it? I think what I'm having trouble understading is 
this- should I return a list of "A" objects with only minimal data 
populated, or would should I create some kind of new object? 

В таких ситуациях, как тот, который вы описать (когда список возвращается, и пользователь может выбрать что-то из него), я заметил, что пользователь обычно выбирает один или две записи чтобы увидеть более подробную информацию. В этом случае вы в конечном итоге вернули список полностью заполненных объектов.

В этом случае, что я делаю, это возврат к простому идентификатору объекта вместо полноценных объектов.

Таким образом, вы можете создать новый класс только с этими данными:

public class C { 
    private Integer idForA; 
    private List<Integer> listOfIdsForB = new ArrayList<Integer>(); 
    //... 
} 

Вы затем написать свой запрос с внешним соединением для возврата идентификаторов A-х и B, и возвращать результат, похожий на этот:

IDtoRecordA1 | IDtoB1 
IDtoRecordA1 | IDtoB2 
IDtoRecordA1 | IDtoB3 

IDtoRecordA2 | IDtoB1   
IDtoRecordA2 | IDtoB3 
IDtoRecordA3 | IDtoB1 

IDtoRecordA3 | IDtoB2 
IDtoRecordA3 | IDtoB3 

IDtoRecordA4 | null 

на этом этапе атрибут тега resultMapgroupBy пригождается, чтобы преобразовать результат в списке C объектов, содержащее это:

C1: IDtoRecordA1, [IDtoB1, IDtoB2, IDtoB3] 
C2: IDtoRecordA2, [IDtoB1, IDtoB3] 
C3: IDtoRecordA3, [IDtoB1, IDtoB2, IDtoB3] 
C4: IDtoRecordA4, [] 

Это также очень полезно избежать N + 1 запросов. Возможно, вы уже это делаете, когда возвращаете объекты со списком B, но если вы используете отдельные запросы для извлечения списка (т. Е. Атрибут select на теге result), я предлагаю вам взглянуть на «Избегание N + 1 Выбирает "разделы в руководстве разработчика iBatis Data Mapper, чтобы свести к минимуму количество запросов, необходимых для возврата данных.

Нижняя линия ...

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

..on С другой стороны, если вы справляетесь небольшое количество данных, представляя другой класс, который обрабатывает идентификаторы, вероятно, усложняют вещи, так что вы можете точно так же вернуть полные объекты-х и Б (но избегая N + 1 запросов, конечно).