[Ljava.lang.Object; cannot be cast to com.gxuwz.check.entity.SysClasses

今天在写ssh项目的时候遇到了这样一个问题,我在数据库通过连表查询A老师下的所有班级的时候,把查出来的所有内容(所有字段)放到List里面,代码如下:

/**

 * @title: queryClasses
 * @description: 查询教师下的所有班级
 * @param user
 */
@Override
public List<SysClasses> queryClasses(String userid) {
	
	String hql = "from SysClasses c,SysTeacher t " + "where c.userId = t.userId and c.userId = ?";
	Session session = getSession();
	Query query = session.createQuery(hql);
	query.setString(0, userid);
	List<SysClasses>  list = query.list();
	session.close();
	return list;
}

然后在前台用el表达式,即对象.属性的方法 ${list.className} 取值得时候总是显示不出来数据,而且还有报错,报错信息如下:(前提是我只想要className属性,只有SysClasses表中有而SysTeacher表中没有)

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.gxuwz.check.entity.SysClasses
	com.gxuwz.check.action.LoginAction.execute(LoginAction.java:69)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.lang.reflect.Method.invoke(Method.java:498)
	com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)
	com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)
	com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)

报错的意思是:Object类型不能够转换成这个实体类SysClasses类型。
之后就开始研究打断点测试
先添加两行代码进行测试,代码如下:

@Override
public List queryClasses(String userid) {

	String hql = "from SysClasses c,SysTeacher t " + "where c.userId = t.userId and c.userId = ?";
	Session session = getSession();
	Query query = session.createQuery(hql);
	query.setString(0, userid);
	List<SysClasses>  list = query.list();
	for(int i = 0;i<list.size();i++) {
		list.get(i);
	}
	session.close();
	return list;
}

断点测试如下:
在这里插入图片描述

我们发现通过连表查询之后返回的Object对象,这是为什么呢?因为只有Object才能够存储任意类型数据和多个字段的数据,何况这里有两张表的数据。

下面详细说一下:

如图上标记的1所示:
Object[10],Object根据表中有的数据自动分配足够的10个空间

如图上标记的2所示:
[0],代表的是上面10个下标中的0号下标的值
[0]=Object[2],意思是把Object[2]中的数据赋值给上面1中的Object[0]:这里体现了分表存储,下面再说

如图上标记的3、4所示:
Object[2]中又存储着两个实体类SysClasses和SysTeacher

以上证明,有几张表的话就自动划分成几个实体类存放到Object中:
我们可以做一下测试,看到底是不是这样自动分配的:
在这里插入图片描述
果然,在我又新添加一个查询列表SysUserLogin之后,下面箭头处的Object有3条数据了
所以说呢,我们在前台用List对象.属性的方式是取不出来的,因为List对象是一个Object类型

jsp页面的部分代码如下:

<s:iterator id="id" value="classSet" var="list">
				<li><a href="Check_stuList.action" target="right">
				<span class="icon-caret-right"></span>${list.className}</a></li>
</s:iterator> 

那到底怎么样才能够取到值呢?怎么样将Object转换成SysClasses呢?前提说好,是不能将Object转换成SysClasses,但是我们可以这样做

代码实例如下:

@Override
	public List<SysClasses> queryClasses(String userid) {
		
		String hql = "from SysClasses c,SysTeacher t " + "where c.userId = t.userId and c.userId = ?";
		Session session = getSession();
		Query query = session.createQuery(hql);
		query.setString(0, userid);
		List<Object>  list = query.list();//将查出来的某一条记录放到Object中
		
		List<SysClasses> slist = new ArrayList<SysClasses>();
		SysClasses c  = new SysClasses();
		
		for(int i=0;i<list.size();i++){
			Object[] a = (Object[]) list.get(i);//list.get(0)的时候包括a[0]SysClasses  a[1]SysTeacher,如之前图的讲解
			slist.add((SysClasses) a[0]);//将list.get(0)中的两个实体类分别放到Object[0]和Object[1]中,每一次都将SysClasses取出来即a[0],放到List<SysClasses> slist
		}
		session.close();
		return slist;
	}

代码详细讲解:
在这里插入图片描述

我们的目的是每次都取到红色箭头处这个实体类:上代码一行一行来

第一轮for循环
Object[] a = (Object[]) list.get(i);

list.get(0)的值为 [0]=Object[2] (id=159)这个整体,这里面还有值。将其赋给a对象

slist.add((SysClasses) a[0]);

a[0]为SysClasses下面的所有数据

在这里插入图片描述
最终添加到slist这个List类型的对象中

第二轮for循环
Object[] a = (Object[]) list.get(i);

list.get(1)的值为 [1]=Object[2] (id=160)这个整体,这里面还有值。将其赋给a对象

slist.add((SysClasses) a[0]);

a[0]为SysClasses下面的所有数据

在这里插入图片描述

最终添加到slist这个List类型的对象中

以此类推哈!

这样我们就能取到值了
在这里插入图片描述

如果此文对你有帮助记得点赞哦!转载请附上博主文章地址
https://mp.csdn.net/mdeditor/103286771

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梁同学与Android

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

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

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

打赏作者

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

抵扣说明:

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

余额充值