Mybatisの1対多マッピングのやり方
MyBatis において、1 対多マッピングは、以下のような方法で実現できます。
- ネストクエリを利用して、親エンティティオブジェクト内に子エンティティオブジェクトのコレクションを定義し、子エンティティオブジェクトのデータを取得するためにネストクエリステートメントを使用します。例:
<!-- 父实体对象 -->
<resultMap id="parentResultMap" type="Parent">
<id property="id" column="id" />
<result property="name" column="name" />
<!-- 子实体对象集合 -->
<collection property="children" ofType="Child">
<id property="id" column="child_id" />
<result property="name" column="child_name" />
</collection>
</resultMap>
<!-- 查询语句 -->
<select id="getParents" resultMap="parentResultMap">
SELECT p.id, p.name, c.id AS child_id, c.name AS child_name
FROM parent_table p
LEFT JOIN child_table c ON p.id = c.parent_id
</select>
- ネストされた結果を使用する: 親エンティティオブジェクトに子エンティティオブジェクトを含んだプロパティを定義し、ネストされた結果タグを使って子エンティティオブジェクトのデータをマッピングする。たとえば:
<!-- 父实体对象 -->
<resultMap id="parentResultMap" type="Parent">
<id property="id" column="id" />
<result property="name" column="name" />
<!-- 子实体对象 -->
<association property="child" javaType="Child">
<id property="id" column="child_id" />
<result property="name" column="child_name" />
</association>
</resultMap>
<!-- 查询语句 -->
<select id="getParents" resultMap="parentResultMap">
SELECT p.id, p.name, c.id AS child_id, c.name AS child_name
FROM parent_table p
LEFT JOIN child_table c ON p.id = c.parent_id
</select>
- ネストした選択(Nested Selects)を使用します。親エンティティオブジェクトには子エンティティオブジェクトを含むプロパティを定義し、ネストした選択タグを使用して子エンティティオブジェクトのデータを取得します。例:
<!-- 父实体对象 -->
<resultMap id="parentResultMap" type="Parent">
<id property="id" column="id" />
<result property="name" column="name" />
<!-- 子实体对象 -->
<association property="child" javaType="Child" select="getChildsByParentId" />
</resultMap>
<!-- 子实体对象的查询语句 -->
<select id="getChildsByParentId" resultType="Child">
SELECT id, name
FROM child_table
WHERE parent_id = #{id}
</select>
<!-- 查询语句 -->
<select id="getParents" resultMap="parentResultMap">
SELECT id, name
FROM parent_table
</select>
getChildsByParentIdは、独立したクエリで子エンティティのデータを獲得するために使われる。一方、ネストによるselect属性は実行されるクエリを指定する。
各種の一般的な一对多マッピングの実装方法は上記の通りです。具体的な業務要件とデータ構造に応じて、適切な実装方法を選択できます。