MyBatis を Spring Boot プロジェクトで使用する際、「Result Maps collection already contains value for」というエラーが発生するのは、<resultMap> 要素の id 属性が重複していることを示す典型的な構成ミスです。以下に、主な原因とそれぞれに対応する具体的な修正手順を解説します。
1. MyBatis Generator の多重実行による XML の重複定義
MyBatis Generator は既存の Mapper.xml ファイルを上書きせず、末尾に新規マッピングを追記するため、同一 id(例:BaseResultMap)を持つ <resultMap> が複数存在する状態になりやすいです。
- 確認方法:対象の
XXXMapper.xmlを開き、<resultMap id="BaseResultMap"が2回以上出現していないか検索 - 対処法:不要な定義を削除し、
idが一意になるよう整理。Generator 再実行前には、対象ファイルを完全に削除してから実行することを推奨
2. YAML 構文の不備(インデント・空白文字)
Spring Boot の application.yml では、YAML のインデントが厳密に解釈されるため、余分なスペースや不足した空白がマッパー読み込み失敗を引き起こします。
mybatis:
mapper-locations: classpath:mapper/**/*.xml
上記のように、mapper-locations のキーと値の間には**半角スペースが1つ必須**であり、先頭のインデントも統一されている必要があります。Tab 文字の混入や、パス文字列の前後に不要な空白があると、設定が無視され、予期しないマッパーが読み込まれる可能性があります。
3. MyBatis 設定の二重登録
application.properties で mybatis.mapper-locations を指定しつつ、別途 mybatis-config.xml 内で <mappers> セクションを定義している場合、同一マッパーが2回ロードされ、結果マップの重複が発生します。
解決策:外部の mybatis-config.xml から <mappers> タグおよびその子要素を完全に削除し、マッパーの管理は Spring Boot 側のプロパティに一本化します。
4. resultType と resultMap の使い分け誤り
複雑なオブジェクト(例:関連エンティティ含む)を返すクエリで resultType を使用すると、MyBatis は自動マッピングを試みますが、ネストされたプロパティやコレクションのマッピングが失敗し、内部的に不正な ResultMap 参照が生成されることがあります。
- 単純な POJO(フィールド名とカラム名が一致)→
resultType="com.example.User" - アソシエーション・コレクション・カスタム型変換が必要 →
resultMap="userWithPostsMap"を明示的に定義し、<resultMap id="userWithPostsMap">を用いる
5. MySQL JDBC ドライバの設定ミス
generatorConfig.xml 内の <classPathEntry> で指定する JDBC ドライバ JAR パスに、以下の点に注意が必要です:
- 絶対パスまたは Maven ローカルリポジトリ内の正確なパスであること(例:
C:/Users/xxx/.m2/repository/mysql/mysql-connector-java/8.0.33/mysql-connector-java-8.0.33.jar) - ファイル名は必ず
.jarで終わること - パス中に日本語・スペース・特殊文字(
&,#,%など)を含まないこと
また、application.yml のデータソース設定でも、driver-class-name は使用するドライババージョンに応じて変更が必要です:
- MySQL Connector/J 5.x →
com.mysql.jdbc.Driver - MySQL Connector/J 8.x →
com.mysql.cj.jdbc.Driver
6. アノテーション未解決(赤波線)の原因
IDE 上で @Mapper, @Select などのアノテーションが認識されない場合、最も一般的なのは依存ライブラリの欠落です。特に以下の依存を pom.xml に明示的に追加してください:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
Maven の依存解決後、IDE で「Reload project」または「Maven → Reload project」を実行し、キャッシュを更新します。
7. Git クローン後のビルド失敗
リポジトリをクローン後、IDE のターミナルでビルドエラーが発生する場合、Windows 環境ではデフォルトの PowerShell ではなく、Git Bash を選択してコマンドを実行すると、パス処理やエンコーディングの問題を回避できます。また、mvn clean compile を実行前に、target/ ディレクトリの削除も有効です。