关联的MyBatis集合只返回一行

时间:2015-05-19 08:49:01

标签: java mybatis

我要将MyBatis用于项目,并且我正在尝试使用我的关联中的集合定义resultMap。

我会简化我的问题,所以我们假设我的数据库有两个表:

世界 [idWorld,worldName]

等级 [idLevel, levelName, idWorld

我想让每个世界和所有级别相关联。 目前,我设法通过此结果图获得所有结果:

<resultMap type="World" id="WorldResultMap">
    <id property="idWorld" column="idWorld"/>
    <result property = "worldName" column="worldName"/>
        <collection property="level" javaType="java.util.ArrayList" ofType="Level">
            <result property="idLevel" column="idLevel" />
            <result property="levelName" column="levelName" />
        </collection>
</resultMap>

但是在映射后我得到了这样的结果:

  <worlds>
        <world>
            <idWorld>1</idWorld>
            <worldName> Wordl's name</worldName>
            <level> ... </level>
            <level> ... </level>
        </world>
         <world>
            <idWorld>2</idWorld>
            <worldName> Wordl's name</worldName>
            <level> ... </level>
            <level> ... </level>
            <level> ... </level>
        </world>
<worlds>

当我想要这样的东西时:

<worlds>
            <world>
                <idWorld>1</idWorld>
                <worldName> Wordl's name</worldName>
                <levels>
                        <level> ... </level>
                        <level> ... </level>
                 </levels> 
            </world>
             <world>
                <idWorld>2</idWorld>
                <worldName> Wordl's name</worldName>
                <levels>
                          <level> ... </level>
                          <level> ... </level>
                          <level> ... </level>
                </levels>
            </world>
    <worlds>

我正在尝试使用以下结果映射获得此结果:

<resultMap type="World" id="WorldResultMap">
        <id property="idWorld" column="idWorld"/>
        <result property = "worldName" column="worldName"/>
            <association property="levels" javaType="Levels">
                 <collection property="level" javaType="java.util.ArrayList" ofType="Level">
                     <result property="idLevel" column="idLevel" />
                     <result property="levelName" column="levelName" />
                 </collection>
            </association>
    </resultMap>

我改变了我的实体,以便将等级列表变为等级而不再进入世界。 我的问题是我在上一个结果映射中使用相同的查询只为每个世界获得一个级别。 我想我错过了“协会”的使用。 如何将我的所有关卡升级?

任何帮助将不胜感激,提前谢谢。

1 个答案:

答案 0 :(得分:4)

替换

<result property="idLevel" column="idLevel" />

<id property="idLevel" column="idLevel" />

然后你应该得到预期的结果。

来自mybatis-doc#Result_Maps

的引用
  

非常重要:id元素在嵌套结果映射中起着非常重要的作用。您应始终指定一个或多个可用于唯一标识结果的属性。事实是,如果你把它排除在外,MyBatis仍然可以工作,但是性能成本很高。选择尽可能少的可以唯一标识结果的属性。主键是一个明显的选择(即使是复合键)。

如果id不存在,&#34; MyBatis仍然可以使用&#34;。似乎MyBatis会过滤掉它认为的重复行。