7

mybatisマッピングと結合を使用してサービスを書き直し、データベース/mybatisレイヤーでエンティティを完全に完成させたいと考えています。

<resultMap id="ParentMap" type="org.example.mybatis.Parent">
    <id column="id" jdbcType="VARCHAR" property="id" />
    <id column="Name" jdbcType="VARCHAR" property="name" />
    <id column="SurName" jdbcType="VARCHAR" property="surName" />

    <collection property="childs" column="ChildId"
        javaType="ArrayList" ofType="org.example.mybatis.Child"
        resultMap="org.example.ChildMap" />    
</resultMap>

<resultMap id="ChildMap" type="org.example.mybatis.Parent">

    <id column="id" jdbcType="VARCHAR" property="id" />
    <id column="Name" jdbcType="VARCHAR" property="name" />
    <id column="SurName" jdbcType="VARCHAR" property="surName" />
    <id column="Age" jdbcType="INTEGER" property="age" />
</resultMap>

<sql id="Parent_Column_List">
    p.Id, p.Name, p.SurName,
</sql>  

<sql id="Child_Column_List">
    c.Id, c.ParentId c.Name, c.SurName, c.Age
</sql>  

<select id="getParent" parameterType="java.lang.String" resultMap="ParentMap" >
    select 
    <include refid="Parent_Column_List"/>

    <include refid="Child_Column_List" />
    from Parent p

    left outer join Child c on p.Id = c.ParentId
    where p.id = #{id,jdbcType=VARCHAR}

次の問題は、親に子がない場合、nullまたはデフォルトのフィールドを持つデフォルトのエンティティがリストに追加されることです。これが外部結合の性質であることは理解していますが、mybatisはこれが偽物であることを理解するのにあまり賢くないのでしょうか。

これに関するいくつかの回避策はありますか?結果として親エンティティが必要なため、内部結合を使用できません。

4

2 に答える 2

19

コレクションに属性を配置する必要がありnotNullColumnます。したがって、resultMapは次のようになります。

<resultMap id="ParentMap" type="org.example.mybatis.Parent">
    <id column="id" jdbcType="VARCHAR" property="id" />
    <id column="Name" jdbcType="VARCHAR" property="name" />
    <id column="SurName" jdbcType="VARCHAR" property="surName" />

    <collection property="childs" column="ChildId" notNullColumn="id"
        javaType="ArrayList" ofType="org.example.mybatis.Child"
        resultMap="org.example.ChildMap" />    
</resultMap>

また、2つで問題が発生する可能性があることに注意してください。そのidためc.id as ChildId、選択項目にを含める必要があります。

于 2012-10-24T09:59:11.577 に答える
0

これはデフォルトで機能するはずです。を追加する必要はありませんnotNullColumn

MyBatisデフォルトで空のオブジェクトを検出します。

このテストをプロジェクトに含めたところです。ぜひご覧ください。

コード

于 2013-01-22T09:12:01.643 に答える