Mybatis2到MyBatis3转换 - 具有相同属性的结果

时间:2017-04-19 14:16:06

标签: java mybatis

我正在努力将大型MyBatis2地图转换为MyBatis3地图,并遇到一个问题,即resultMapresult个元素使用相同的property }属性(并且该类是从我控制之外的WSDL生成的):

<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>

请注意,这两个属性都是&#34; addressLine&#34;。

这适用于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对象中围绕生成的类编写包装器,因为这会导致项目中的重大重构工作。我可以在地图中添加一些内容吗?

1 个答案:

答案 0 :(得分:1)

您可以在生成的dto中添加第二个setter(setAddressLine2) 您的代码可以添加到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

如果不可能,则需要创建测试项目并在https://github.com/mybatis/mybatis-3上创建问题并请求功能。

这个选项可能最好,因为我不确定你是否正确使用它。看来你的第二个例子(使用集合)是正确的(至少从概念上来说。你仍然可以使用它来映射到同一个属性)但是第一个例子表现得像你解释的那样吗?