当前位置:   article > 正文

xxx(实体类) cannot be cast to xxx(实体类)

cannot be cast to

一、问题描述
今天在测试分页接口的时候,遇到了这个问题,xxx can be cast to xxx,意思是某实体类型不能“转化”为另一个实体类型,在开发中要尽量避免重复踩坑,以此写一篇博客来记录一下。由于问题不好复现,只能简单描述一下,我用的框架是mybatis
二、举例说明
定义一个实体类User

public class User{
	//用户id
	Long id;
	//用户名
	String username;
	//密码
	String password;
	//获取id
	public Long getId(){
		return this.id;
	}
	//设置id
	public void setId(Long id){
		this.id = id;
	}
	//获取用户名
	public String getUsername(){
		return this.username;
	}
	//设置用户名
	public void setUsername(String username){
		this.username = username;
	}
	//获取密码
	public String getPassword(){
		return this.password;
	}
	//设置密码
	public void setPassword(String password){
		return this.username;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

接下来再定义一个,用户结果集实体UserResult,用于返回查询用户时需要的字段,比如只需要返回用户名和密码

public class UserResult{
	//用户名
	String username;
	//密码
	String password;
	//获取用户名
	public String getUsername(){
		return this.username;
	}
	//设置用户名
	public void setUsername(String username){
		this.username = username;
	}
	//获取密码
	public String getPassword(){
		return this.password;
	}
	//设置密码
	public void setPassword(String password){
		return this.username;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

接下来写mapper文件,UserMapper.java

public Interface UserMapper{
	/**
	* @param form这里是可能是列表分页的参数
	* @return List<UserResult> 返回列表
	*/
	List<UserResult> queryUserList(UserPageForm form);
}	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

对应的UserMapper.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="UserMapper">
<!-- 用户类型 -->
    <resultMap id="userMapper" type="User">
        <result column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="password" property="password"/>
   </resultMap>
<!-- 用户结果集类型 -->   
   <resultMap id="userResultMapper" type="UserResult">
        <result column="username" property="username"/>
        <result column="password" property="password"/>
   </resultMap>
  <!-- 查询用户列表sql,这里的返回类型是userMapper-->
   <select id="queryUserList" resultMap="userMapper">
        select u.*,
        u.id as id,
        u.username as username,
        u.password as password
 		from user u 	
    </select>
</mapper>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

接下来,是service了

public Interface IUserService{
	/**
	* @param form这里是可能是列表分页的参数
	* @return List<UserResult> 返回列表
	*/
	List<UserResult> queryUserList(UserPageForm form);
}	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

实现类

public class UserServiceImpl implements IUserService{
private UserMapper userMapper;
	List<UserResult> queryUserList(UserPageForm form){
		//这一步也不会出问题list仍然会显示出来,但是如果要给视图封装一些数据查不出的字段
		List<UserResult> resultList  =  userMapper.queryUserList(form);
		//fengzhuang()是一个方法,可以对UserResult封装一下,再返回,但是到这一步可能会报错
		resultList.stream().map(
		userResult -> fengzhuang(userResult)
		).collect(collectors.toList());
		return resultList;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

解决
以上就是基本的复现场景,基本上写了是很难发现问题的,除非debug一步步排查,只要将sql语句的返回类型改为UserResultMap就可以了,所以开发过程中还是要仔细的,各个环节都要注意到,否则一个问题可能卡很久,从而影响开发进度。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/305285
推荐阅读
相关标签
  

闽ICP备14008679号