Java Mybatis一对多集合映射始终具有一个默认实体
我想重写我们的服务,以使用mybatis映射和联接,使我们的实体在数据库/mybatis层上完整和完成Java Mybatis一对多集合映射始终具有一个默认实体,java,sql,spring,mybatis,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" />
<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不是很聪明地理解这是假的吗
有什么解决办法吗?我无法使用内部联接,因为父实体必须在结果中。必须将属性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作为ChildId。默认情况下,这应该可以工作。无需添加NotNull列 默认情况下,MyBatis检测空对象 我刚刚在项目中加入了这个测试,请看一下
谢谢。用户指南中没有记录此属性。您的问题去年被报告为错误。如果你好奇的话,我会给你这个链接。这里的问题是ParentMap和ChildMap都有一个id列。即使外部联接没有任何记录,它仍将创建具有任何匹配列的子对象。当映射共享相同的列时,notNullColumn是告诉MyBatis对象应为null的正确方法,除非notNullColumn不为null。@Nathanial您省去了我一天编写单独映射器的工作。。。干杯