我写了如下的映射文件。
<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值作为不同的记录处理。 但是在我搜索的互联网上的手册或其他资源中没有解释这种行为。
是否有此行为的信息?
答案 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,则它们都映射在同一对象中。 你的表应该有一个主键,但我想你创建一个假身份证可能会作为一种解决方法。