2016-05-07 74 views
3

の値が含まれている私は、私は私のマッパーインタフェースのための注釈を使用し、何のXML設定はありませんMyBatisの - マップされたステートメントのコレクションはすでに

[artifact:mvn] 2016-05-07 11:39:21,708 [ERROR] org.mybatis.spring.mapper.MapperFactoryBean - Error while adding the mapper 'interface com.sample.mappers.UserMapper' to configuration. 
[artifact:mvn] java.lang.IllegalArgumentException: Mapped Statements collection already contains value for com.sample.mappers.UserMapper.getAllUsers 
[artifact:mvn] at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:802) 
[artifact:mvn] at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:774) 
[artifact:mvn] at org.apache.ibatis.session.Configuration.addMappedStatement(Configuration.java:598) 
[artifact:mvn] at org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(MapperBuilderAssistant.java:300) 
[artifact:mvn] at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parseStatement(MapperAnnotationBuilder.java:313) 
[artifact:mvn] at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parse(MapperAnnotationBuilder.java:128) 
[artifact:mvn] at org.apache.ibatis.binding.MapperRegistry.addMapper(MapperRegistry.java:72) 
[artifact:mvn] at org.apache.ibatis.session.Configuration.addMapper(Configuration.java:671) 
[artifact:mvn] at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:81) 
[artifact:mvn] at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44) 

、私のサーバーの起動時にマッパークラスを登録するときにスローされる次のエラーメッセージを持っていました。

は以下

public interface UserMapper { 

    @Select("SELECT * FROM customer") 
    List<User> getAllUsers(); 

    @Select("SELECT * FROM customer where userId = #{userId} ") 
    List<User> getAllUsers(Long userId); 

} 

答えて

6

は、私は、エラーメッセージの原因を見つけ、私のUserMapperインタフェースです。同じメソッド名を使用している場合、mybatisはMapped Statements collection already contains valueというエラーメッセージをスローします。したがって、メソッドのシグネチャが異なる場合でも、異なるマッパーステートメントに対して異なるメソッド名を使用することが解決策です。

私のマッパーインターフェイスでは、メソッド名の先頭にの名前がgetUserById();である必要があります。 mapper.xmlファイルのいずれかに同じメソッド名がある場合、同じエラーがスローされます。ですから、mybatisが実行時にこれをマップするためには、異なるSQL文に対して一意のメソッド名またはマッパーの名前空間を持つことが必須です。

-1

多分あなたのパラメータタイプが間違っています。 resultTypeやresultMap、parameterTypeなど...

+0

おそらく最良の答えではありません。回答は既に掲載されており、間違ったパラメータタイプは含まれていません –

1

私の場合、発生したのはresultMapsがマッパーの追加後に設定に追加されたためです。

例:

Configuration configuration = new Configuration(environment); 
configuration.addMappers("com.hemant.data.mapper"); 
configuration.addResultMap(getResultMapForRoles(configuration)); 

我々はMyBatisのソースコードを観察する場合には、 configuration.addMappers(..)に.....()を解析が実行されます。 org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parse() org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parseStatement(方法)

for (Method method : methods) { 
     try { 
      // issue #237 
      if (!method.isBridge()) { 
      parseStatement(method); 
      } 
     } catch (IncompleteElementException e) { 
      configuration.addIncompleteMethod(new MethodResolver(this, method)); 
     } 
     } 

解析すると問題がある場合ステートメント(ステートメントが@ResultMapアノテーションを持っていたのでmycaseで発生しましたが、resultMapはコンフィグレーションに提供されていませんでした)、メソッドはINCOMPLETE_METHODSの設定で追加され、後で例外が発生します。

この:マッパー前の設定にこのresultMapを追加することで

@Select("select role_id, role_name, allowed_actions::bigint, denied_actions::bigint from acm_role") 
    @ResultMap("com.hemant.data.mapper.RoleMapper." + PermissionDBHook.ROLE_MAP) 
    public List<Role> getAllRoles(); 

は、この答えは質問とは直接関係ありませんが、同様のエラーが直面している他の人のために有用である可能性

Configuration configuration = new Configuration(environment); 
    //Hemant - result map should be added before mappers 
    configuration.addResultMap(getResultMapForRoles(configuration)); 
    configuration.addMappers("com.hemant.data.mapper"); 
0

それを解決しましたMyBatisがマッパー内のメソッドの1つに対して複数の定義を見つけると、エラーがスローされたようです。私の場合は、というアノテーションとXMLの定義の両方をメソッドとして用意しています()。これらのいずれかを削除すると、問題が解決しました。

+0

これは私の回答で既に述べました。 – Lucky

関連する問題