关联的 MyBatis 集合只有 return 一行

MyBatis collection in association only return one row

我必须将 MyBatis 用于一个项目,并且我正在尝试在我的关联中定义一个带有集合的 resultMap。

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

世界 [idWorld, worldName]

等级 [id级别, 级别名称, 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>

我更改了我的实体,以便将级别列表变成级别,而不是世界。 我的问题是在我的最后一个结果地图中使用相同的查询,每个世界只得到一个级别。 我想我想念 "association" 的用法。 我怎样才能把我所有的等级都变成等级?

任何帮助将不胜感激,在此先感谢。

替换

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

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

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


引自mybatis-doc#Result_Maps

Very Important: id elements play a very important role in Nested Result mapping. You should always specify one or more properties that can be used to uniquely identify the results. The truth is that MyBatis will still work if you leave it out, but at a severe performance cost. Choose as few properties as possible that can uniquely identify the result. The primary key is an obvious choice (even if composite).

如果 id 不存在,则 "MyBatis will still work"。看来 MyBatis 会过滤掉它认为重复的行。