teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

1:1のマッピングに置き換える実装に修正

2020/09/29 13:12

投稿

A-pZ
A-pZ

スコア12011

answer CHANGED
@@ -1,11 +1,8 @@
1
- MyBatisはJPAアノテーションは特に利用しません。
1
+ 1:1親子関係の場合
2
2
 
3
- リレション関係にある検索果のマッピングについては [https://qiita.com/alpha_pz/items/9c88acd814ffad2f1a36](https://qiita.com/alpha_pz/items/9c88acd814ffad2f1a36) を参考にしてください
3
+ ブルの親子関係は detail_id でついていますので、親Entityを以下に設定し、これの子をDetailとした場合、次のように 子要素が1以上ありますので、List<Detail> detailIds として宣言します
4
4
 
5
- テータの親子関係は detail_id で結びついていますので、親Entityを以下に設定し、これの子をDetailとした場合は、次のように 子要素が1以上ありますので、List<Detail> detailIds として宣言します。
6
-
7
5
  ```java
8
- import java.util.List;
9
6
  import lombok.Data;
10
7
 
11
8
  @Data
@@ -13,7 +10,7 @@
13
10
  private String id;
14
11
  private String name;
15
12
  private String age;
16
- private List<Detail> detailIds;
13
+ private Detail detail;
17
14
  }
18
15
  ```
19
16
 
@@ -54,11 +51,13 @@
54
51
  <id property="id" column="id" />
55
52
  <result property="name" column="name" />
56
53
  <result property="age" column="age" />
57
- <collection property="detailIds" ofType="com.github.apz.entity.Detail">
58
- <result property="detailId" column="detail_id" />
54
+ <association property="detail" resultMap="detailResult"/>
59
- <result property="work" column="work"/>
60
- </collection>
61
55
  </resultMap>
56
+
57
+ <resultMap id="detailResult" type="com.github.apz.entity.Detail">
58
+ <result property="detailId" column="detail_id" />
59
+ <result property="work" column="work" />
60
+ </resultMap>
62
61
  </mapper>
63
62
  ```
64
63
 
@@ -69,8 +68,9 @@
69
68
 
70
69
  <resultMap>では、実際に検索結果で得たい内容(今回はPlayer)に対する結果のマッピングを行います。 property は Javaクラス側のプロパティ(変数) columnはSQLのカラムです。
71
70
 
72
- テーブル結合の条件となっている detail_id の記述方法ですが、親要素である player の detailIdsが子要素を持つことをPlayerクラスで宣言していている状態を記述します。
71
+ テーブル結合の条件となっている detail_id の記述方法ですが、親要素である player の detail が子要素を持つことをPlayerクラスで宣言していている状態を記述します。
73
72
 
74
- propertyで、子クラスを束ねる親クラスのフィールド名 detailIds であり、その内容は ofType で宣言したクラスになります。
73
+ propertyで、子クラスを束ねる親クラスのフィールド名 detail であり、その内容は type で宣言したクラスで、この2つのマッピングの関係は、resultMapのid="detailResult" で関連づけられます。
75
74
 
75
+
76
- 一般的にこの手法は1:Nのブルで使ますが、1:1でも同じ構文で利用可能です
76
+ 1:Nのリレション関係にある検索結果のマッピングにつては [https://qiita.com/alpha_pz/items/9c88acd814ffad2f1a36](https://qiita.com/alpha_pz/items/9c88acd814ffad2f1a36) を参考にしてください

2

詳細なマッピング定義と説明を記載しました。

2020/09/29 13:12

投稿

A-pZ
A-pZ

スコア12011

answer CHANGED
@@ -2,4 +2,75 @@
2
2
 
3
3
  リレーション関係にある検索結果のマッピングについては [https://qiita.com/alpha_pz/items/9c88acd814ffad2f1a36](https://qiita.com/alpha_pz/items/9c88acd814ffad2f1a36) を参考にしてください。
4
4
 
5
+ テータの親子関係は detail_id で結びついていますので、親Entityを以下に設定し、これの子をDetailとした場合は、次のように 子要素が1以上ありますので、List<Detail> detailIds として宣言します。
6
+
7
+ ```java
8
+ import java.util.List;
9
+ import lombok.Data;
10
+
11
+ @Data
12
+ public class Player {
13
+ private String id;
14
+ private String name;
15
+ private String age;
16
+ private List<Detail> detailIds;
17
+ }
18
+ ```
19
+
20
+ ```java
21
+ import lombok.Data;
22
+
23
+ @Data
24
+ public class Detail {
25
+ private String detailId;
26
+ private String work;
27
+ }
28
+ ```
29
+
30
+ これを検索するSQL(SQLマッピング)は次のようになります。
31
+
32
+ ```xml
33
+ <?xml version="1.0" encoding="UTF-8" ?>
34
+ <!DOCTYPE mapper
35
+ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
36
+ "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
37
+ <mapper namespace="com.github.apz.mapper.PlayerMapper">
38
+ <select id="findById" resultMap="playerMap">
39
+ SELECT
40
+ player.id
41
+ , player.name
42
+ , player.age
43
+ , player.detail_id
44
+ , detail.work
45
+ FROM
46
+ player
47
+ JOIN DETAIL
48
+ ON player.detail_id = detail.detail_id
49
+ WHERE
50
+ player.id = #{id}
51
+ </select>
52
+
53
+ <resultMap type="com.github.apz.entity.Player" id="playerMap">
54
+ <id property="id" column="id" />
55
+ <result property="name" column="name" />
56
+ <result property="age" column="age" />
57
+ <collection property="detailIds" ofType="com.github.apz.entity.Detail">
5
- mapping.xmlを見た限りでは、SQLの検索結果にdetail_id がないことと、親要素と子要素を紐づける detail_idをListなどで格納していないことが原因です。
58
+ <result property="detailId" column="detail_id" />
59
+ <result property="work" column="work"/>
60
+ </collection>
61
+ </resultMap>
62
+ </mapper>
63
+ ```
64
+
65
+ ポイントとなる点ですが、
66
+
67
+ テーブルを結合する条件(今回は detail_id)を必ずSQLに盛り込みます。
68
+ 検索の結果は resultMap要素で別途定義します。
69
+
70
+ <resultMap>では、実際に検索結果で得たい内容(今回はPlayer)に対する結果のマッピングを行います。 property は Javaクラス側のプロパティ(変数) columnはSQLのカラムです。
71
+
72
+ テーブル結合の条件となっている detail_id の記述方法ですが、親要素である player の detailIdsが子要素を持つことをPlayerクラスで宣言していている状態を記述します。
73
+
74
+ propertyで、子クラスを束ねる親クラスのフィールド名 detailIds であり、その内容は ofType で宣言したクラスになります。
75
+
76
+ 一般的にこの手法は1:Nのテーブルで使いますが、1:1でも同じ構文で利用可能です。

1

mappingの内容が更新されたので回答をあわせて修正しました。

2020/09/28 13:30

投稿

A-pZ
A-pZ

スコア12011

answer CHANGED
@@ -1,3 +1,5 @@
1
1
  MyBatisはJPAのアノテーションは特に利用しません。
2
2
 
3
- リレーション関係にある検索結果のマッピングについては [https://qiita.com/alpha_pz/items/9c88acd814ffad2f1a36](https://qiita.com/alpha_pz/items/9c88acd814ffad2f1a36) を参考にしてください。
3
+ リレーション関係にある検索結果のマッピングについては [https://qiita.com/alpha_pz/items/9c88acd814ffad2f1a36](https://qiita.com/alpha_pz/items/9c88acd814ffad2f1a36) を参考にしてください。
4
+
5
+ mapping.xmlを見た限りでは、SQLの検索結果にdetail_id がないことと、親要素と子要素を紐づける detail_idをListなどで格納していないことが原因です。