Сопоставление коллекции (‘select *’) с полем в MyBatis

#java #mybatis

#java #mybatis

Вопрос:

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

Но давайте начнем с самого начала, с первого класса учетной записи

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

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

 <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.Карта содержит пару имя столбца / значение.

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

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

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

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

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

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

Ответ №1:

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

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

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

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