2017-04-19 78 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上創建問題並請求一個功能。

該選項可能是最好的反正因爲我不知道你是否正確使用它。看起來你的第二個例子(使用集合)是正確的(至少在概念上,你仍然不能使用它映射到同一個屬性),但第一個例子不會像你解釋的那樣工作?