<resultmap>行为

时间:2017-12-05 08:32:40

标签: mybatis

我写了如下的映射文件。

<resultMap id="fooResultMap" type="Foo" >
  <result column="NAME" property="name" jdbcType="VARCHAR" />
  <association property="bar" resultMap="barResultMap" />
</resultMap>

当我获得相同NAME colmun值的2条记录时,mybatis只返回1个Foo对象。 我想要2个Foo对象因为栏的列不同。

所以,我在下面解决了。

<resultMap id="fooResultMap" type="Foo" >
  <id column="dummy_column_for_unique" />
  <result column="NAME" property="name" jdbcType="VARCHAR" />
  <association property="bar" resultMap="barResultMap" />
</resultMap>

我添加了&lt; id&gt; &lt; resultMap&gt;中的标记和&#34; dummy_column_for_unique&#34;列是虚拟的(不存在)。 我成功地获得了2个Foo对象。

我认为虚拟列结果为null,而mybatis可能将null值作为不同的记录处理。 但是在我搜索的互联网上的手册或其他资源中没有解释这种行为。

是否有此行为的信息?

2 个答案:

答案 0 :(得分:1)

在mybatis的邮件列表中,我被建议使用行号。 https://groups.google.com/forum/#!topic/mybatis-user/FAvrJ4piYlU

所以,我的最终结果地图如下所示。

<resultMap id="fooResultMap" type="Foo" >
  <id column="rownum" />
  <result column="NAME" property="name" jdbcType="VARCHAR" />
  <association property="bar" resultMap="barResultMap" />
</resultMap>

并且sql如下所示(原始sql由外部选择句子包装,因为没有修改原始sql,而且这个sql语法适用于mysql)。

select @rownum:=@rownum+1 as rownum, org.* from (
### original sql ###
) org, (select @rownum:=0) r

我希望这会对某人有所帮助。

答案 1 :(得分:0)

MyBatis使用ID映射对象。如果ResultMap中没有ID,则它们都映射在同一对象中。 你的表应该有一个主键,但我想你创建一个假身份证可能会作为一种解决方法。