Сопоставление коллекции ('select *') с полем в MyBatis - PullRequest
1 голос
/ 27 октября 2011

Я сложен.Я хотел бы заменить прямое использование sql в пользу mybatis faramework .Я хотел бы выбрать список счетов с заполненной картой свойств.

Но давайте начнем с самого начала, первый класс Account

public class Account {
     private int id;
     ...
     private Map<String, String> properties;
     ...
     //setters / getters
}

Интерфейс Mapper для Account очевиден, а файл отображения содержит селекторы

<select id="getAccountById" resultMap="account">
       select ... from account where id = #{id}
</select>

<select id="getAccountProperties" resultType=map>
       select * from properties where id=#{id}
</select>

Первый выбор возвращает объект Account, второй java.util.Map содержит имя столбца / значение пара.

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

for(Account account : accountList) {
    int id = account.getId();
    Map properites = mapper.getAccountProperties(id);
    account.setProperties(properties);
}

И в основном это работает, но для 200 учетных записей это занимает около 2 минут, и это не приемлемо.

Я надеюсь, что использование resultMap с collection ускорит его.Но вопрос в том, как это сделать.Как должно выглядеть resultMap="account"

<resultMap id="account" type="Account">
   <id property="id" column="id">
   ...
   <collection property="properties" javaType="map" column="id" select="getAccountProperties" />
</resultMap>

В этом случае выбранный объект учетной записи не содержит никаких свойств.Большой вопрос: как связать свойства с объектом аккаунта?

1 Ответ

3 голосов
/ 13 ноября 2011

Если вы используете следующую таблицу результатов

<resultMap id="account" type="Account">
    <result property="id" column="id">
    <result property="properties" column="id" select="getAccountProperties" />
</resultMap>

Затем для каждой учетной записи MyBatis выполняет инструкцию getAccountProperties, передавая значение идентификатора столбца в качестве параметра, но вы должны разрешить принять его в теге выбора:

<select id="getAccountProperties" resultClass="java.util.Map" parameterClass="java.lang.Integer" >
    select * from properties where id=#value#
</select>
...