700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > [Ljava.lang.Object; cannot be cast to com.gxuwz.check.entity.SysClasses

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

时间:2019-02-16 02:07:48

相关推荐

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

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

/**

* @title: queryClasses* @description: 查询教师下的所有班级* @param user*/@Overridepublic 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.SysClassescom.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,但是我们可以这样做

代码实例如下:

@Overridepublic 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类型的对象中

以此类推哈!

这样我们就能取到值了

如果此文对你有帮助记得点赞哦!转载请附上博主文章地址

/mdeditor/103286771

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。