今天在写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.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类型的对象中

以此类推哈!

这样我们就能取到值了

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

[Ljava.lang.Object; cannot be cast to com.gxuwz.check.entity.SysClasses相关推荐

  1. hql投影查询之—— [Ljava.lang.Object; cannot be cast to cn.bdqn.guanMingSys.entity.Notice

    最近在做项目中遇到一个简单的问题,但是解决了好久,问题就是投影查询. 先来看看出现的异常: java.lang.ClassCastException: [Ljava.lang.Object; cann ...

  2. 关于Object数组强转成Integer数组的问题:Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;...

    一.当把Object数组,强转的具体的Integer数组时,会报错. 代码如下: //数组强转报错演示 Object[] numbers = {1,2,3};Integer[] ints = (Int ...

  3. 关于java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to 实体类

    由于业务逻辑的复杂,有些sql语句写法hql不支持,所以hibernate查询直接用了sql原生查询,由于数据结果根据四个表查询出来,所以无法使用方法.addEntity(XXXXXXX.class) ...

  4. java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String,toArray向下转型失败

    问题: 将集合通过toArray转为Object[]数组后,再通过向下转型失败 源代码: public void test(){List<String> list = new ArrayL ...

  5. Ljava.lang.Object; cannot be cast to……异常

    这是因为类型无法转换抛出的异常. 在hibernate框架中,使用了select语句,没有指定返回数据类型,所以默认为Object类,它是所有类的父类.所以当我们遍历list的时候,Object无法转 ...

  6. java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to

    本例错误是Hibernate产生 Session session= sessionFatory.getCurrentSession(); SQLQuery sqlquery= session.crea ...

  7. 解决:java.lang.ClassCastException:[Ljava.lang.Object

    java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.alibaba.domain.Person解决方法: p ...

  8. org.hibernate.transientobjectexception:The given object has a null identifier: com.gxuwz.check.entit

    错误信息: org.hibernate.TransientObjectException: The given object has a null identifier: com.gxuwz.chec ...

  9. 在拦截器中获取请求参数,[Ljava.lang.String; cannot be cast to java.lang.String报错

    Map<String,Object> parametersmap=invocation.getInvocationContext().getParameters();//获取请求参数    ...

最新文章

  1. python下线程以及锁
  2. tomcat的jdbc连接池PoolExhaustedException
  3. 最详细的Mac下安装nacos教程来了
  4. php全局cors,PHP开启CORS - slagga的个人页面 - OSCHINA - 中文开源技术交流社区
  5. mysql5.1安装失败_解决MySQL5.1安装时出现Cannot create windows service for mysql.error:0
  6. java游戏暂停_小白写了个java的小游戏 想加个暂停的功能 无从下手 求大佬们帮...
  7. 如何解压POSIX tar archive文件
  8. 思科 Security Manager 12个0day PoC 被公开,多个严重 0day仍未修复
  9. POJ 3133 Manhattan Wiring(插头DP)
  10. 三种DDL的简述:create、alter、drop
  11. 根据输入时间判断年龄是否在18~68周岁之间
  12. Modelsim查看中间变量
  13. 如何利用数字化工具提高工作效率?
  14. k8s 集群全部更换机器 IP
  15. 2021 年年度蕞佳开源软件!
  16. 【EasyRL学习笔记】第五章 Proximal Policy Optimization 近端策略优化算法
  17. Python简介及入门
  18. SpringBoot请求报403 Forbidden
  19. 和警察蜀黍拍照像“抓捕现场”?效哥告诉你正确拍照姿势!
  20. 计算机技术应用体验,2018教师信息技术应用体验学习个人心得体会2篇

热门文章

  1. 八.使用OpenCv图像平滑操作
  2. MySQL创建函数,报错;SQL Error (1418)
  3. 递归下降分析法(编译原理)
  4. win10安装scrapy
  5. 四旋翼姿态解算——基础理论及推导
  6. 【机器学习入门笔记0:OpenCV+TensorFlow学习内容(目录)】20190122
  7. 6kyu Build a pile of Cubes
  8. 计算机二级vb和vba,读取本机硬件信息的VBA代码
  9. 微型计算机基础知识答案,计算机基础知识(答案已填)
  10. 调用bash shell脚本的方式