关联中的 MyBatis 集合只返回一行

Rel*_*aks 4 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>
Run Code Online (Sandbox Code Playgroud)

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

  <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>
Run Code Online (Sandbox Code Playgroud)

当我想要这样的东西时:

<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>
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

我更改了我的实体,以便将级别列表转换为级别而不是世界。我的问题是我在最后一个结果地图中使用相同的查询为每个世界只得到一个级别。我想我想念理解“关联”的用法。我怎样才能让我的所有级别都进入级别?

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

exc*_*ite 5

代替

<result property="idLevel" column="idLevel" />
Run Code Online (Sandbox Code Playgroud)

<id property="idLevel" column="idLevel" />
Run Code Online (Sandbox Code Playgroud)

那么你应该得到预期的结果。


来自mybatis-doc#Result_Maps 的引用

非常重要:id 元素在嵌套结果映射中扮演着非常重要的角色。您应该始终指定一个或多个可用于唯一标识结果的属性。事实是,如果您不使用 MyBatis,它仍然可以工作,但会造成严重的性能损失。选择尽可能少的可以唯一标识结果的属性。主键是一个显而易见的选择(即使是复合键)。

如果id不存在,“MyBatis 仍然可以工作”。看来MyBatis 会过滤掉它认为的重复行。