Я изучаю возможности картографирования MyBatis 3.0.5. База данных H2 (1.3.160) в запущенном встроенном режиме. С помощью руководства пользователя я получил простые рабочие части. Но мне трудно сопоставить Set
, который использует HashMap
в качестве резервного хранилища.
Вот код Java для пользовательской коллекции, в которой пользовательское поле задано как (упрощено для краткости)
public class CustomCollection
{
@JsonProperty
private CustomSet<CustomItem> customItems;
public CustomCollection()
{
customItems = new CustomSet<CustomItem>();
}
// other stuff
}
Вот код CustomSet
(опять упрощенно)
public class CustomSet<E extends CustomItemInterface> extends AbstractSet<E>
{
private ConcurrentHashMap<String, E> items;
public CustomSet()
{
items = new ConcurrentHashMap<String, E>();
}
// other stuff
}
Вот интерфейс отображения:
public interface CustomCollectionMapper
{
CustomCollection select(@Param("somename") String s1, @Param("someothername") String s2);
}
Это код, который выполняет вызов в инфраструктуру Mybatis:
SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) servletContext.getAttribute("SqlSessionFactory");
SqlSession session = sqlSessionFactory.openSession();
CustomCollection coll = null;
try
{
CustomCollectionMapper mapper = session.getMapper(CustomCollectionMapper.class);
coll = mapper.select(param1, param2);
}
finally
{
session.close();
}
Вот что я мог придумать с отображением XML:
<select id="select" resultMap="CustomCollectionMapping">
-- What goes here???
</select>
<resultMap type="com.example.CustomCollection" id="CustomCollectionMapping">
<association property="customItems" javaType="com.example.customSet">
<collection property="items" javaType="HashMap" ofType="com.example.CustomItem" select="selectCustomItems">
</collection>
</association>
</resultMap>
<select id="selectCustomItems" parameterType="map" resultType="com.example.CustomItem">
-- SQL query to return multiple CustomItem rows
</select>
Через различные итерации я получил ошибку «слишком много результатов», какую-то другую ошибку или ничего (ноль возвращается из вызова mapper), но никогда результат, который мне нужен. Код SQL работает сам по себе, и если я попрошу List с простым оператором select, я получу строки и ArrayList. У меня проблема с заполнением вложенных объектов коллекции.
Я много раз читал руководство, искал примеры, но не смог придумать правильный XML-код для этой цели. Буду признателен, если кто-нибудь сможет мне помочь или укажет на источник, который может помочь.
Заранее спасибо за помощь.