предполагая, что мы имеем MyBatis 3.3.0 и MyBatis-Spring 1.2.3 и простой запрос на выборку ...MyBatis Ошибка на Сборнике Map.Entry и Map.entrySet()
<select id="testSelect" parameterType="map" resultType="Integer">
select 1 from dual where
<foreach collection="properties" index="index" item="item" separator=" and ">
1 = #{id} AND 'a' = #{item.key,jdbcType=VARCHAR} AND 'b' = #{item.value,jdbcType=VARCHAR}
</foreach>
</select>
(должны просто Возвращает 1, если идентификатор дается в 1 и все ключевые свойства, приведенные в коллекции «а» и все значения «б»)
... что делает простой метод TestMapper
интерфейс ...
Integer testSelect(Map<String, Object> arguments);
... и мы проверить его с помощью этого метода испытаний ...
@Test
public void test_for_bug() {
final Map<String, Object> parameters = new HashMap<>();
parameters.put("id", 1);
final Map<String, String> entries = new HashMap<>();
entries.put("a", "b");
parameters.put("properties", entries.entrySet());
final Integer result = this.testMapper.testSelect(parameters);
assertThat(result).isEqualTo(1);
}
... мы получим следующую ошибку ....
Тип обработчик был нулевым картографирование параметров для недвижимости '__frch_item_0.value'. Он не был указан и/или не мог найти для указанной комбинации javaType/jdbcType.
Причина этого, кажется, что призыв к item.value
результатам в вызове value
свойства самой строки. К сожалению, я понятия не имею, почему.
Замена entries.entrySet()
с Collection
обычая Entry
объектов (с key
и value
собственности) работает отлично. Также странно: Это только кажется, что произойдет внутри <collection>
, давая Map.Entry
непосредственно в качестве параметра, как ...
<select id="testSelect" parameterType="map" resultType="Integer">
select 1 from dual where 'b' = #{entry.value,jdbcType=VARCHAR}
</select>
... и ...
@Test
public void test_for_bug() {
final Map<String, String> entries = new HashMap<>();
entries.put("a", "b");
final Map<String, Object> parameters = new HashMap<>();
parameters.put("entry", entries.entrySet().iterator().next());
final Integer result = this.testMapper.testSelect(parameters);
assertThat(result).isEqualTo(1);
}
... работ.
Кто-нибудь знает, в чем проблема с Map.EntrySet здесь? Какой-нибудь шанс получить это как-то? Конечно, создание обходного пути достаточно просто, но имхо не нужно.
Почему вы используете parameters.put ("properties", entries.entrySet())? –
В этом случае, поскольку это простой способ дать набор ключевых пар значений из карты ... Другими словами: почему бы и нет? Это либо это, либо преобразование карты вручную в набор объектов с атрибутами ключа/значения ... (И технически, я не знаю, поскольку я не писал оригинальный код, я просто нашел там ошибку). –