Mybatis一对多集合映射始终具有一个默认实体

时间:2012-10-24 09:42:55

标签: java sql spring 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}

接下来出现问题:如果父级没有子级,则会将一些带有null或default字段的默认实体添加到列表中。 我明白这是外连接的本质,但mybatis不是很聪明地明白这是假的吗?

是否有一些解决方法?我不能使用内连接,因为父实体必须在结果中。

2 个答案:

答案 0 :(得分:16)

您必须将属性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>

请注意,您可能也会遇到两个id的问题,因此您可能需要在选择中添加c.id as ChildId

答案 1 :(得分:0)

这应该默认有效。无需添加notNullColumn

MyBatis默认检测到空对象。

我刚刚在项目中包含了这个测试,请看一下。

Code