目录
问题现象:
问题分析:
下面的情况则更加复杂:
解决方法:
问题现象:
今天在使用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">
即可解决问题!!!!!!