环境
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 {
...
}
在次发起请求问题解决。