我正在努力将大型MyBatis2地图转换为MyBatis3地图,并遇到一个问题,即resultMap
个result
个元素使用相同的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使用相同的模式,我会得到IllegalArgumentException
:Result 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 :(得分: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上创建问题并请求功能。
这个选项可能最好,因为我不确定你是否正确使用它。看来你的第二个例子(使用集合)是正确的(至少从概念上来说。你仍然可以使用它来映射到同一个属性)但是第一个例子表现得像你解释的那样吗?