回答編集履歴

3

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

2020/09/29 13:12

投稿

A-pZ
A-pZ

スコア12011

test CHANGED
@@ -1,18 +1,12 @@
1
- MyBatisはJPAアノテーションは特に利用しません。
1
+ 1:1親子関係の場合
2
2
 
3
3
 
4
4
 
5
- リレーション関係にある検索結果のマッピングについては [https://qiita.com/alpha_pz/items/9c88acd814ffad2f1a36](https://qiita.com/alpha_pz/items/9c88acd814ffad2f1a36) を参考にしてください。
6
-
7
-
8
-
9
- テーの親子関係は detail_id で結びついていますので、親Entityを以下に設定し、これの子をDetailとした場合は、次のように 子要素が1以上ありますので、List<Detail> detailIds として宣言します。
5
+ テーブルの親子関係は detail_id で結びついていますので、親Entityを以下に設定し、これの子をDetailとした場合は、次のように 子要素が1以上ありますので、List<Detail> detailIds として宣言します。
10
6
 
11
7
 
12
8
 
13
9
  ```java
14
-
15
- import java.util.List;
16
10
 
17
11
  import lombok.Data;
18
12
 
@@ -28,7 +22,7 @@
28
22
 
29
23
  private String age;
30
24
 
31
- private List<Detail> detailIds;
25
+ private Detail detail;
32
26
 
33
27
  }
34
28
 
@@ -110,13 +104,17 @@
110
104
 
111
105
  <result property="age" column="age" />
112
106
 
113
- <collection property="detailIds" ofType="com.github.apz.entity.Detail">
107
+ <association property="detail" resultMap="detailResult"/>
114
108
 
115
- <result property="detailId" column="detail_id" />
109
+ </resultMap>
116
110
 
117
- <result property="work" column="work"/>
118
111
 
112
+
113
+ <resultMap id="detailResult" type="com.github.apz.entity.Detail">
114
+
115
+ <result property="detailId" column="detail_id" />
116
+
119
- </collection>
117
+ <result property="work" column="work" />
120
118
 
121
119
  </resultMap>
122
120
 
@@ -140,12 +138,14 @@
140
138
 
141
139
 
142
140
 
143
- テーブル結合の条件となっている detail_id の記述方法ですが、親要素である player の detailIdsが子要素を持つことをPlayerクラスで宣言していている状態を記述します。
141
+ テーブル結合の条件となっている detail_id の記述方法ですが、親要素である player の detail が子要素を持つことをPlayerクラスで宣言していている状態を記述します。
144
142
 
145
143
 
146
144
 
147
- propertyで、子クラスを束ねる親クラスのフィールド名 detailIds であり、その内容は ofType で宣言したクラスになります。
145
+ propertyで、子クラスを束ねる親クラスのフィールド名 detail であり、その内容は type で宣言したクラスで、この2つのマッピングの関係は、resultMapのid="detailResult" で関連づけられます。
148
146
 
149
147
 
150
148
 
149
+
150
+
151
- 一般的にこの手法は1:Nのブルで使ますが、1:1でも同じ構文で利用可能です
151
+ 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

test CHANGED
@@ -6,4 +6,146 @@
6
6
 
7
7
 
8
8
 
9
+ テータの親子関係は detail_id で結びついていますので、親Entityを以下に設定し、これの子をDetailとした場合は、次のように 子要素が1以上ありますので、List<Detail> detailIds として宣言します。
10
+
11
+
12
+
13
+ ```java
14
+
15
+ import java.util.List;
16
+
17
+ import lombok.Data;
18
+
19
+
20
+
21
+ @Data
22
+
23
+ public class Player {
24
+
25
+ private String id;
26
+
27
+ private String name;
28
+
29
+ private String age;
30
+
31
+ private List<Detail> detailIds;
32
+
33
+ }
34
+
35
+ ```
36
+
37
+
38
+
39
+ ```java
40
+
41
+ import lombok.Data;
42
+
43
+
44
+
45
+ @Data
46
+
47
+ public class Detail {
48
+
49
+ private String detailId;
50
+
51
+ private String work;
52
+
53
+ }
54
+
55
+ ```
56
+
57
+
58
+
59
+ これを検索するSQL(SQLマッピング)は次のようになります。
60
+
61
+
62
+
63
+ ```xml
64
+
65
+ <?xml version="1.0" encoding="UTF-8" ?>
66
+
67
+ <!DOCTYPE mapper
68
+
69
+ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
70
+
71
+ "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
72
+
73
+ <mapper namespace="com.github.apz.mapper.PlayerMapper">
74
+
75
+ <select id="findById" resultMap="playerMap">
76
+
77
+ SELECT
78
+
79
+ player.id
80
+
81
+ , player.name
82
+
83
+ , player.age
84
+
85
+ , player.detail_id
86
+
87
+ , detail.work
88
+
89
+ FROM
90
+
91
+ player
92
+
93
+ JOIN DETAIL
94
+
95
+ ON player.detail_id = detail.detail_id
96
+
97
+ WHERE
98
+
99
+ player.id = #{id}
100
+
101
+ </select>
102
+
103
+
104
+
105
+ <resultMap type="com.github.apz.entity.Player" id="playerMap">
106
+
107
+ <id property="id" column="id" />
108
+
109
+ <result property="name" column="name" />
110
+
111
+ <result property="age" column="age" />
112
+
113
+ <collection property="detailIds" ofType="com.github.apz.entity.Detail">
114
+
9
- mapping.xmlを見た限りでは、SQLの検索結果にdetail_id がないことと、親要素と子要素を紐づける detail_idをListなどで格納していないことが原因です。
115
+ <result property="detailId" column="detail_id" />
116
+
117
+ <result property="work" column="work"/>
118
+
119
+ </collection>
120
+
121
+ </resultMap>
122
+
123
+ </mapper>
124
+
125
+ ```
126
+
127
+
128
+
129
+ ポイントとなる点ですが、
130
+
131
+
132
+
133
+ テーブルを結合する条件(今回は detail_id)を必ずSQLに盛り込みます。
134
+
135
+ 検索の結果は resultMap要素で別途定義します。
136
+
137
+
138
+
139
+ <resultMap>では、実際に検索結果で得たい内容(今回はPlayer)に対する結果のマッピングを行います。 property は Javaクラス側のプロパティ(変数) columnはSQLのカラムです。
140
+
141
+
142
+
143
+ テーブル結合の条件となっている detail_id の記述方法ですが、親要素である player の detailIdsが子要素を持つことをPlayerクラスで宣言していている状態を記述します。
144
+
145
+
146
+
147
+ propertyで、子クラスを束ねる親クラスのフィールド名 detailIds であり、その内容は ofType で宣言したクラスになります。
148
+
149
+
150
+
151
+ 一般的にこの手法は1:Nのテーブルで使いますが、1:1でも同じ構文で利用可能です。

1

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

2020/09/28 13:30

投稿

A-pZ
A-pZ

スコア12011

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