IllegalArgumentException异常产生原因及解决方案

IllegalArgumentException异常产生原因及解决方案

01 异常发生场景

  • 当我在使用mybatis执行MySQL语法时出现的bug
<!--mybatis的映射-->
<resultMap id="OrdersVoResult" type="OrdersVo">
    <!-- id配置的是主键,就是表的主键 -->
    <!-- property是实体类的属性名 -->
    <!-- cloumn是sql查询出来的字段名 -->
    <id property="orderId" column="order_id"></id>
    <!-- result是其他的字段 -->
    <result property="orderNum" column="order_num"></result>
    <result property="orderTime" column="order_time"></result>
    <collection property="products"  javaType="ordersDtlVo">
        <id property="orderDtlId" column="order_dtl_id"></id>
        <result property="productId" column="product_id"></result>
        <result property="productName" column="product_name"></result>
        <result property="productSellingPrice" column="product_selling_price"></result>
        <result property="num" column="num"></result>
        <result property="productPicture" column="product_picture"></result>
    </collection>
</resultMap>
<select id="selectOrders" resultMap="OrdersVoResult">
SELECT
    t1.order_id,
    t1.create_time,
    t1.order_num,
    t2.order_dtl_id,
    t2.product_id,
    t2.product_name,
    t2.product_selling_price,
    t2.num,
    t2.product_price
    FROM
    orders AS t1
    left JOIN
    orders_dtl AS t2
    ON t1.order_id = t2.order_id
    WHERE
    t1.user_id = #{userId}
</select>

02 异常的产生原因

  • 在数据库里SQL语句的执行是没有问题的

  • 经过查询百度,发现是非法传参异常,也就是参数传的类型冲突,但是我前前后后对了好几次参数,确定了实体类参数对应没有问题

  • 那么问题出在哪里呢?经过查询mybatis3的官方文档,我找到了问题的所在

  • javaType一个 Java 类的全限定名,或一个类型别名(关于内置的类型别名,可以参考上面的表格)。 如果你映射到一个 JavaBean,MyBatis 通常可以推断类型
    ofType也是一个 Java 类的全限定名,但映射对应的参数是数组
  • 我的实体类

    public class OrdersVo {
        private Long orderId;
        private String orderNum;
        private Date orderTime;
        private List<OrdersDtlVo> products;
    }
    
  • 很明显可以看出其中一个参数是list集合,但我简单的使用javaType设置路径,所以才造成了IllegalArgumentException(参数映射问题)

03 解决方式

  • 很简单,在映射集合时,使用ofType映射对应的参数即可

  • 修改后的mybtais映射

  • <resultMap id="OrdersVoResult" type="OrdersVo">
        <!-- id配置的是主键,就是表的主键 -->
        <!-- property是实体类的属性名 -->
        <!-- cloumn是sql查询出来的字段名 -->
        <id property="orderId" column="order_id"></id>
        <!-- result是其他的字段 -->
        <result property="orderNum" column="order_num"></result>
        <result property="orderTime" column="order_time"></result>
        <collection property="products"  ofType="ordersDtlVo">
            <id property="orderDtlId" column="order_dtl_id"></id>
            <result property="productId" column="product_id"></result>
            <result property="productName" column="product_name"></result>
            <result property="productSellingPrice" column="product_selling_price"></result>
            <result property="num" column="num"></result>
            <result property="productPicture" column="product_picture"></result>
        </collection>
    </resultMap>
    <select id="selectOrders" resultMap="OrdersVoResult">
    SELECT
        t1.order_id,
        t1.create_time,
        t1.order_num,
        t2.order_dtl_id,
        t2.product_id,
        t2.product_name,
        t2.product_selling_price,
        t2.num,
        t2.product_price
        FROM
        orders AS t1
        left JOIN
        orders_dtl AS t2
        ON t1.order_id = t2.order_id
        WHERE
        t1.user_id = #{userId}
    </select>
    
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宣布无人罪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值