昨天遇到的一个mybatis嵌套映射的问题,今天终于在mybatis的issue中找到类似的问题,并成功解决了它。
解决的issue:嵌套<collection>
的<association>
返回意外结果: https://github.com/mybatis/mybatis-3/issues/1835
定义的映射方式
<resultMap id="ExtResultMap" type="com.xxx.SamplePageDTO">
<association property="sample" columnPrefix="sp_" resultMap="BaseResultMap"/>
<collection property="productList" columnPrefix="pl_"
resultMap="com.xxx.SampleProductMapper.ExtResultMap"/>
</resultMap>
<!-- com.xxx.SampleProductMapper.ExtResultMap -->
<resultMap id="ExtResultMap" type="com.xxx.SampleProductDTO">
<association property="product" columnPrefix="p_"
resultMap="com.xxx.ProductMapper.productInfoMap"/>
<collection property="applyImage" columnPrefix="spi_"
resultMap="com.xxx.SampleProductImageMapper.BaseResultMap"/>
</resultMap>
定义的实体类
public class SamplePageDTO {
private SamplePage sample;
private List<SampleProductDTO> productList;
}
public class SampleProductDTO implements Serializable {
private static final long serialVersionUID = 6392533762543411354L;
private ProductInfo product;
private List<SampleProductImage> applyImage;
}
预期结果
{
"sample":Object{...},
"productList":[
{
"product":Object1{...},
"applyImage":Array[2]{1,2}
},
{
"product":Object2{...},
"applyImage":Array[2]{3,4}
}
]
}
实际结果
[
{
"sample":Object{...},
"productList":[
{
"product":Object1{...},
"applyImage":Array[1]{1}
}
]
},
{
"sample":Object{...},
"productList":[
{
"product":Object1{...},
"applyImage":Array[1]{2}
}
]
},
{
"sample":Object{...},
"productList":[
{
"product":Object2{...},
"applyImage":Array[1]{3}
}
]
},
{
"sample":Object{...},
"productList":[
{
"product":Object2{...},
"applyImage":Array[1]{4}
}
]
}
]
这个结果还导致了一个mybatis的映射异常,因为预期获得一个DTO的对象,实际则是获得了4个DTO对象。当我把预期结果改为一个列表时,得到的就是上面那样的映射结果,很显然与我们预期的不同,mybatis并没有为我自动归档成一个对象,而是按照SQL执行结果的行数为每一个DTO都分配了一个子对象。
解决方式
根据issue中提供的解决方式,在需要归档的地方加上一个<id>
标签,使得mybatis可以为我们分组归档。
那么上述定义的ResultMap
将修改成下面的方式
<resultMap id="ExtResultMap" type="com.xxx.SamplePageDTO">
<!-- 添加一个只有按列分组的属性,而不添加实体属性(因为没有定义对应的实体属性) --->
<id column="sp_id"/>
<association property="sample" columnPrefix="sp_" resultMap="BaseResultMap"/>
<collection property="productList" columnPrefix="pl_"
resultMap="com.xxx.SampleProductMapper.ExtResultMap"/>
</resultMap>
<!-- com.xxx.SampleProductMapper.ExtResultMap -->
<resultMap id="ExtResultMap" type="com.xxx.SampleProductDTO">
<!-- 添加一个只有按列分组的属性,而不添加实体属性(因为没有定义对应的实体属性) --->
<id column="p_id"/>
<association property="product" columnPrefix="p_"
resultMap="com.xxx.ProductMapper.productInfoMap"/>
<collection property="applyImage" columnPrefix="spi_"
resultMap="com.xxx.SampleProductImageMapper.BaseResultMap"/>
</resultMap>
经过实验,我成功得到了预期的结果,that’s good!
将上述问题记录希望可以帮到你!