Mybatisplus映射实体类改变字段顺序映射出错问题解决

当Mybatisplus的xml字段顺序与实体类字段顺序不一致,且实体类因@AllArgsConstructor注解缺失无参构造函数时,会导致映射错误。源码解析表明,实体类有无参构造方法时按字段名映射,否则按顺序映射。解决方案包括移除@AllArgsConstructor或手动添加@NoArgsConstructor。
摘要由CSDN通过智能技术生成

问题描述

xml内容如下

<select id="XXX" resultType="XXX.XX.AppResubscribeVO">
        SELECT app.app_name,
               app_id,
               spec.spec_name,
               ...

实体类如下

@Data
@AllArgsConstructor
public class AppResubscribeVO
{
   
    @ApiModelProperty(value = "应用名")
    private String appName;

    @ApiModelProperty(value = "规格名")
    private String specName;

    @ApiModelProperty(value = "应用ID")
    private Integer appId;
   ...

如图,xml的字段(app_id,spec_name)和实体的字段(specName,appId)顺序不一致,且两个字段的类型也不一致,分别是String和Integer。此时又加了注解@AllArgsConstructor全参构造函数,则没有默认的无参构造函数。这种情况就会导致映射实体出错。

源码剖析

此问题的核心源码mybatisplus是
org.apache.ibatis.executor.resultset.DefaultResultSetHandler#createResultObject(ResultSetWrapper rsw, ResultMap resultMap, List<Class<?>> constructorArgTypes, List<Object> constructorArgs, String columnPrefix)
其他过程源码略
我们来看一下这个方法
private Object createResultObject(ResultSetWrapper rsw, ResultMap resultMap, List<Class<?>> constructorArgTypes, List<Object> constructorArgs, String columnPrefix)
      throws SQLException {
   
    final Class<?> resultType = resultMap.getType()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值