mybatisplus实体类映射报错: java.lang.ClassCastException: User cannot be cast to UserVo

目录

问题现象:

问题分析:

下面的情况则更加复杂:

解决方法:


问题现象:

今天在使用springboot+mybatisplus做项目的时候,设置完mapper.xml文件之后发生了以下异常:

        java.lang.ClassCastException: com.stephen.xxxxxx..model.User cannot be cast to com.stephen.xxxxxx.vmodel.UserVo


问题分析:

这个问题经常会发生在视图模型(vmodel实体类)中,一般我们的物理模型(model实体类)的每个属性都只用于存储数据库表中一一对应的字段.

但很多时候我们需要传递给前端的数据往往不止这么简单,很多时候我们会添加额外的数据返回给前端,而这些数据是无法对应到数据库表中的;因此就需要引申出了视图模型的概念了.

假如,我们返回给前端的数据比数据库表中有的数据要,我们可以用视图模型放入前端需要的属性即可;

假如,我们返回给前端的数据比数据库表中有的数据要,我们可以用视图模型继承其对应的物理模型,再放入前端需要的额外属性;

很多时候,我们返回给前端的数据比数据库表中有的数据要复杂得多,因此经常需要添加额外的属性,和相应的getter/setter方法;

下面的情况则更加复杂:

有时候,我们不仅要返回某个单表的数据,还得返回联表查询后的某些数据给前端,这就更加复杂了,但是细分下来,其实也很简单!

首先,我们需要基于某个物理模型,在其对应的mapper.xml文件中,进行修改,我们可以添加额外的sql标签,列出联表select后需要用到的的所有列名.如:

<sql id="View_Column_List">

user_name,

dept_name

</sql>

//这里user_name,和dept_name来自两个不同数据库表的数据.

然后建立新的resultMap,如下:

<resultMap id="ViewResultMap" type="com.stephen.xxxxxx.vmodel.User">
    <result column="user_name" property="userName"/>
    <result column="dept_name" property="deptName"/>
</resultMap>

但是有个问题需要注意的,就是我标了黑体字的User.

这个问题也是导致抬头中提到的那个错误的发生:

java.lang.ClassCastException: com.stephen.xxxxxx..model.User cannot be cast to com.stephen.xxxxxx.vmodel.UserVo

name,到底错误是什么呢?

我们看下面的代码:

<resultMap id="BaseResultMap" type="com.stephen.xxxxxx.vmodel.User">
    <result column="user_id" property="userId"/>
    <result column="user_name" property="userName"/>
</resultMap>

问题就在于我们直接复制了这段BaseResultMap的代码,而没有注意到,type的问题.

type属性用于配置实体类映射关系,由于我们的视图模型UserVo和物理模型User属性是不同的,

因此映射类型自然也不同,而我们在返回数据给前端的时候,肯定会应用到基于ViewResultMap所映射的数据关系,

ViewResultMap并不能映射到User上,因此出现报错.


解决方法:

<resultMap id="ViewResultMap" type="com.stephen.xxxxxx.vmodel.User">

改为:

<resultMap id="ViewResultMap" type="com.stephen.xxxxxx.vmodel.UserVo">

即可解决问题!!!!!!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值