0

我有下一个 resultMap

        <resultMap id="resultMap" type="***.PreMigrationData"
                   autoMapping="true">
...
     <association property="tmpCase" javaType="***.TmpCase" columnPrefix="i_">
                 <id column="sid" property="sid"/>
            <result column="pid" property="pid"/>
                <collection property="routes" ofType="***.Route"
                            resultMap="routes" columnPrefix="rt_"/>
            </association>
        </resultMap>
    
        <resultMap id="routes" type="***.Route">
            <result column="sid" property="sid"/>
            <result column="pid" property="pid"/>
            ...
        </resultMap>

实体类。

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class PreMigrationData{


   ...
    private TmpCase tmpCase;
}



@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class TmpCase {

    private Long sid;

    private Long pid;
    ...

    private List<Route> routes;
}

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Route {
    private Long sid;
    private Long pid;
}

SQL:

    <select id="getCases" resultMap="resultMap">

        <include refid="select"/>
WHERE ...
</select>
        <sql id="select">
            select
            <include refid="case">
                <property name="alias" value="pi"/>
                <property name="prefix_source" value="i_"/>
            </include>,
    <include refid="rotue">
                <property name="alias" value="pir"/>
                <property name="prefix_source" value="i_rt_"/>
            </include>
      from tmp_case pi
    LEFT JOIN route pir on pir.PID = pi.SID

在 db 层,路由具有 TmpCase 的外键:route.pid -> tmpCase.sid。

  1. 已经尝试过:在没有包装 MigrationData 的情况下使其相同并且它按预期工作,但我严格需要这种结构并使用 columnPrefix。
  2. 问题:我得到错误的映射,即 insted 获取 TmpCase 列表,其中包含路由列表,我得到的 TmpCase 列表只有一个路由元素。
  3. 预期:TmpCase.getRoutes() 是多个元素的列表
  4. 实际: TmpCase.getRoutes() 是一个或零个元素的列表。

我认为这可能是我误解了关联块内的工作收集块与 columnPrefix 的关系。我正在阅读文档,但没有。我会很高兴得到任何帮助。

4

1 回答 1

0

我找到了解决方案。层次结构中的每个类都必须具有正确工作的集合块。在我的情况下,顶级类 PreMigrationData 在数据库中没有 id。我让他们从子类中识别出来,这对我来说很好用

于 2021-05-26T12:19:33.603 回答