2017-04-19 41 views
0

我正在将大的MyBatis2映射转换为MyBatis3映射,并且遇到了一些问题,我有一个resultMap多个result元素使用相同的property属性(并且该类是从我的控制之外的WSDL生成的):Mybatis2到MyBatis3的转换 - 结果具有相同的属性

<resultMap id="blah" class="someWsdlGeneratedClass"> 
    <result property="addressLine" 
      resultMap="addressLineOneListMap" 
      javaType="java.util.List" /> 
    <result property="addressLine" 
      resultMap="addressLineTwoListMap" 
      javaType="java.util.List" /> 
</resultMap> 
<resultMap id="addressLineXListMap" class="string"> 
    <!-- Result maps are the same except for column --> 
    <result property="addressLine" column="COLUMN_X" /> 
</resultMap> 

注意这两个属性都是“addressLine”。

这适用于Mybatis2。但是,如果我尝试使用MyBatis3同样的模式,我得到一个IllegalArgumentExceptionResult Maps collection already contains value for Mapper.mapper_resultMap[blah]_collection[addressLine]

<resultMap id="blah" type="someWsdlGeneratedClass"> 
    <collection property="addressLine" 
       resultMap="addressLineOneListMap" 
       javaType="java.util.List" /> 
    <collection property="addressLine" 
       resultMap="addressLineTwoListMap" 
       javaType="java.util.List" /> 
</resultMap> 

我想避免的DTO对象写入周围生成类的包装,如果可能的话,因为这将导致项目中的重大重大工作。有什么我可以添加在地图本身?

+0

我很困惑你的用例。 resultMap.result用于映射到单个属性(例如,java类属性或hashmap属性)。这就是为什么它通过属性名称进行索引。你需要将两次映射到同一个属性的用例是什么? – h3adache

+0

我对继承的代码的理解是,dto和/或其他后台代码处理将各种元素放入同一个数组中。 –

回答

1

您可以将第二个setter(setAddressLine2)添加到您生成的dto中。
其中您的代码只能添加到addressLine中。例如:

void setAddressLine2(final List<Address> addressLine2) { 
    address.addAll(addressLine2); 
} 

如果这是不可能的,你可以尝试改变您的查询返回的2列 的工会不知道你的确切查询它看起来是这样的:

SELECT foo, addressLine1 as Address 
FROM bar 
UNION 
SELECT foo, addressLine2 as Address 
FROM bar 

如果ISN”那么您需要创建一个测试项目并在https://github.com/mybatis/mybatis-3上创建问题并请求一个功能。

该选项可能是最好的反正因为我不知道你是否正确使用它。看起来你的第二个例子(使用集合)是正确的(至少在概念上,你仍然不能使用它映射到同一个属性),但第一个例子不会像你解释的那样工作?