2021年9月26日-Mybatis踩坑记录-mapper映射反参问题

578 阅读1分钟

环境

XXXXXXXXXXXXXXXXXXXXXXX日常踩坑,还是菜。

背景

根据前端传参查询数据的数据。

在反参的Vo上添加了lombok的@Builder注解,如下:

/**
 * @author 
 * 库存同步日志表
 */
@Data
@Builder
public class StoreChangeLogVo implements Serializable {
    /**
     * ID
     */
    private Long id;

    /**
     * 标准库id
     */
    private Long smartId;

    /**
     * 平台商品id
     */
    private Long goodsId;

    /**
     * 商品名称
     */
    private String goodsName;

    /**
     * 通用名称
     */
    private String goodsCommonName;

    /**
     * 规格
     */
    private String spec;

    /**
     * 仓储机构
     */
    private String storageName;

    /**
     * 平台库存更新状态 0: 失败; 1: 成功
     */
    private Byte changeStatus;

    private String changeStatusStr;

    /**
     * 常规库存
     */
    private String skuQuantity;

    /**
     * 神农可用库存数量
     */
    private String availableStock;

    /**
     * 同步库存时间
     */
    private String updateTime;

    /**
     * 原因记录
     */
    private String reason;

    /**
     * 在途数量
     */
    private String stockInTransit;

    /**
     * 预约到货时间
     */
    private String predictTime;

    private static final long serialVersionUID = 1L;

    /**
     * 商家erp sku
     */
    private String outerId;

}

dao层到mapper层映射

List<StoreChangeLogEntity> getStorageLogList(@Param("storeageLogParam") StoreageLogParam storeageLogParam);

mapper.xml

<select id="getStorageLogList"  parameterType="com.xyy.ykq.aggregate.b2c.common.params.StoreageLogParam" resultType="com.xyy.ykq.aggregate.vo.StoreChangeLogVo">
  select
      <include refid="Base_Column_List" />
  from
       o2o_agg_b2c_stock_change_log
  <where>
      <if test="storeageLogParam.smartId != null and storeageLogParam.smartId != ''">
        and smart_id = #{storeageLogParam.smartId,jdbcType=BIGINT}
      </if>
      <if test="storeageLogParam.goodsId != null and storeageLogParam.goodsId != ''">
        and goods_id = #{storeageLogParam.goodsId,jdbcType=BIGINT}
      </if>
      <if test="storeageLogParam.goodsName != null and storeageLogParam.goodsName != ''">
        and goods_name like concat('%',#{storeageLogParam.goodsName,jdbcType=VARCHAR},'%')
      </if>
      <if test="storeageLogParam.goodsCommonName != null and storeageLogParam.goodsCommonName != ''">
        and goods_common_name like concat('%',#{storeageLogParam.goodsCommonName,jdbcType=VARCHAR}, '%')
      </if>
      <if test="storeageLogParam.changeStatus != null and storeageLogParam.changeStatus != ''">
        and change_status = #{storeageLogParam.changeStatus,jdbcType=TINYINT}
      </if>
      <if test="storeageLogParam.updateStartTime != null and storeageLogParam.updateStartTime != ''">
        and update_time <![CDATA[>=]]> #{storeageLogParam.updateStartTime,jdbcType=VARCHAR}
      </if>
      <if test="storeageLogParam.updateEndTime != null and storeageLogParam.updateEndTime != ''">
        and update_time <![CDATA[<=]]> #{storeageLogParam.updateEndTime,jdbcType=VARCHAR}
      </if>
      <if test="storeageLogParam.predictStartTime != null and storeageLogParam.predictStartTime != ''">
        and predict_time <![CDATA[>=]]> #{storeageLogParam.predictStartTime,jdbcType=VARCHAR}
      </if>
      <if test="storeageLogParam.predictEndTime != null and storeageLogParam.predictEndTime != ''">
          and predict_time <![CDATA[<=]]> #{storeageLogParam.predictEndTime,jdbcType=VARCHAR}
      </if>
        and 1=1
  </where>
</select>

在sql查询的时候,sql语句执行正常,但是会出现这样的错误:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.IndexOutOfBoundsException: Index: 14, Size: 14
### The error may exist in file [E:\WorkCompany\heyejiankang\ykq-oms-server\target\classes\mappers\b2c\StockChangeLogMapper.xml]
### The error may involve com.xyy.ykq.aggregate.modular.b2c.dao.StockChangeLogMapper.getStorageLogList
### The error occurred while handling results
### SQL: select id, smart_id, goods_id, goods_name, goods_common_name, spec, storage_name, change_status,  sku_quantity, available_stock, update_time, reason, stock_in_transit, predict_time  from  xxxxxx  WHERE  update_time >= ?  and update_time <= and 1=1 LIMIT ?
### Cause: java.lang.IndexOutOfBoundsException: Index: 14, Size: 14

解决

这是因为添加@Builder注解,然后StoreChangeLogVo没有构造函数,将查询结果转换成javebean的时候出了问题,报错中的14是因为查询了14列。加上构造函数的注解即可。如下

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class StoreChangeLogVo implements Serializable {
...

}

在次发起请求问题解决。