2016-05-16 1 views
1

Эй, я использую Mybatis с Spring Annotations.java.lang.IllegalArgumentException: Результат Коллекция карт уже содержит значение для

и получаю эту ошибку:

Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.mypackage.mappers.QuestionsMapper.Question 

здесь есть класс домена (Sans методы получения и установки):

public class Question { 


    String optionsAsString; 
    String typeAsString; 
    Integer fieldId; 
    String title; 
    String description; 

    public Question(){ 
    } 
} 

вот мой класс Mapper.Java

@MapperScan 
public interface Mapper { 

public List<Question> getQuestions(@Param("shifts") List<Integer> shifts, @Param("job_id") Integer job_id); 
} 

наконец здесь находится Mapper.xml

<mapper namespace="com.mypackage.mappers.Mapper"> 
<resultMap type="com.mypackage.domain.Question" id="Question"> 
    <id column="field_id" property="fieldId" /> 
    <result column="data_type" property="typeAsString" /> 
    <result column="title" property="title" /> 
    <result column="description" property="description" /> 
    <result column="options" property="optionsAsString" /> 
</resultMap> 

<select id="com.mypackage.mappers.Mapper.getQuestions" resultMap="Question" timeout="10"> 
    SELECT 
    f.field_id, 
    f.data_type, 
    f.title, 
    f.options, 
    f.description 
    FROM 
     (SELECT DISTINCT q.* 
     FROM 
      question_services qs INNER JOIN 
      questions q 
      ON qs.field_id=q.field_id AND q.job_id = qs.job_id INNER JOIN 
      services s 
      ON qs.service_id = s.service_id and qs.job_id = s.job_id 
      WHERE s.job_id = #{job_id} AND s.service_id in 
      <foreach item="shift" collection="shifts" open="(" separator="," close=")"> 
       #{shift} 
      </foreach> 
     ) f 
</select> 

Я склонен полагать, что существует что-то не так с XML-оператора выбора. Вероятно, я использую foreach. У меня есть другой картограф, использующий аналогичный формат, который он просто не использует для каждого, и у него нет никаких проблем.

+0

У вас есть другое сопоставление с id = "Question"? – D0dger

+0

Нет. Это то, что я даже пытался изменить, я имел другое сопоставление, где-то имя Вопрос. Я просматривал свои сопоставления и не могу найти его, и изменение имени дает мне ту же ошибку, что и ссылка на новое имя. –

+0

Является ли 'Mapper.Java' и' Mapper.xml' в одном каталоге? – Blank

ответ

1

Yep Похоже, что произошла ошибка где-то в моем заявлении select. В итоге я просто переписал его по-другому.

<select id="getQuestions" resultMap="Question"> 
    SELECT 
     q.field_id, 
     q.data_type, 
     q.title, 
     q.description, 
     q.options 
    FROM 
     questions q 
    WHERE 
     job_id = #{job_id} 
    AND 
     field_id 
    IN 
     (SELECT 
      fs.field_id 
     FROM 
      question_services qs 
     INNER JOIN 
      services s 
     ON 
      qs.service_id = s.service_id 
     AND 
      qs.job_id = s.job_id 
     WHERE 
      s.job_id=#{job_id} 
     AND 
      s.service_id 
     IN 
     <foreach item="item" index="index" collection="shifts" open="(" separator="," close=")"> 
      #{item} 
     </foreach> 
     ); 
</select> 
1

Добавление этого ответа, поскольку в моем случае проблема была иной, но исключение было таким же. Исключение сказало,

Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.mypackage.model.mymapper.BaseResultMap 

Это также может произойти, если у вас есть один и тот же сопоставитель XML, присутствующий в нескольких местах и ​​что дубликат XML получает взял и разобран. Хорошо проверить, что, даже если по ошибке вы сделали резервную копию mapmaster xmls, которая находится в местоположении или вложенных папках, которые сканирует mybatis.