iBatis - Подробный вопрос о заголовке - PullRequest
2 голосов
/ 14 января 2010

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

Существует существующий класс (назовите его классом 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.

}

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

Например:

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

и т.д.

(Примечание: запись А4 не имеет ссылок ни на какие Б - отсюда и внешнее соединение, упомянутое выше)

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

1 Ответ

0 голосов
/ 18 января 2010

По поводу вашего комментария:

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

На этом этапе атрибут groupBy тега resultMap пригодится для преобразования результата в список C объектов, содержащих это:

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

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

Итог ...

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...