gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:22:56 29 4
gpt4 key购买 nike

我正在努力将大型 MyBatis2 映射转换为 MyBatis3 映射,并且遇到了一些问题,其中我有一个带有多个 result 元素的 resultMap 使用相同的 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>

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

这对于 Mybatis2 来说效果很好。但是,如果我尝试对 MyBatis3 使用相同的模式,则会收到 IllegalArgumentException: 结果映射集合已包含 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 对象中围绕生成的类编写包装器,因为这将导致项目中的重大重构工作。我可以在 map 本身中添加一些东西吗?

最佳答案

您可以向生成的 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上创建一个问题并请求一项功能。

无论如何,该选项可能是最好的,因为我不确定您是否正确使用它。看来您的第二个示例(使用集合)是正确的(至少在概念上是正确的。您仍然无法使用它映射到相同的属性),但第一个示例的行为不会像您解释的那样?

关于java - Mybatis2 到 MyBatis3 的转换 - 具有相同属性的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43498317/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com