2012-10-24 52 views
4

我想重寫我們的服務以使用mybatis映射和連接來讓我們的實體在數據庫/ 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} 

問題是下一:如果家長不有孩子的,與空或默認字段一些默認的實體將被添加到列表中。 我明白這是外連接的本質,但是mybatis不是很聰明,要明白這是假的?

有沒有一些解決方法呢?由於父實體需要處於結果中,因此我無法使用內連接。

回答

14

您必須將屬性notNullColumn放入您的集合中。所以,你的結果映射將是:

<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> 

請注意,您也將也許有問題與兩個id,所以你可能在有c.id as ChildId您選擇

+0

非常感謝。此屬性未在用戶指南中記錄 –

+1

您的「問題」在去年被報告爲bug。如果您好奇,我會讓您聯繫。 http://goo.gl/TXfr2 – jddsantaella

0

這應該默認工作。沒有必要添加notNullColumn

MyBatis默認情況下檢測到空對象。

我剛剛在項目中加入了這個測試,請看看它。

Code

+3

這裏的問題是ParentMap和ChildMap都有一個id列。即使外連接沒有記錄,它仍然會創建一個包含任何匹配列的子對象。當地圖共享相同的列時,'notNullColumn'是告訴'MyBatis'對象應該爲空的正確方式,除非'notNullColumn'不爲空。 – Nathanial

+0

@Nathanial你已經救了我一天的努力寫作單獨的mappers ......乾杯 – Shinchan

相關問題