[Ljava.lang.Object; cannot be cast to com.gxuwz.check.entity.SysClasses
今天在寫ssh項(xiàng)目的時(shí)候遇到了這樣一個(gè)問(wèn)題,我在數(shù)據(jù)庫(kù)通過(guò)連表查詢A老師下的所有班級(jí)的時(shí)候,把查出來(lái)的所有內(nèi)容(所有字段)放到List里面,代碼如下:
/**
* @title: queryClasses* @description: 查詢教師下的所有班級(jí)* @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; }然后在前臺(tái)用el表達(dá)式,即對(duì)象.屬性的方法 ${list.className} 取值得時(shí)候總是顯示不出來(lái)數(shù)據(jù),而且還有報(bào)錯(cuò),報(bào)錯(cuò)信息如下:(前提是我只想要className屬性,只有SysClasses表中有而SysTeacher表中沒(méi)有)
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)報(bào)錯(cuò)的意思是:Object類型不能夠轉(zhuǎn)換成這個(gè)實(shí)體類SysClasses類型。
之后就開始研究打斷點(diǎn)測(cè)試
先添加兩行代碼進(jìn)行測(cè)試,代碼如下:
@Override
public List queryClasses(String userid) {
斷點(diǎn)測(cè)試如下:
我們發(fā)現(xiàn)通過(guò)連表查詢之后返回的Object對(duì)象,這是為什么呢?因?yàn)橹挥蠴bject才能夠存儲(chǔ)任意類型數(shù)據(jù)和多個(gè)字段的數(shù)據(jù),何況這里有兩張表的數(shù)據(jù)。
下面詳細(xì)說(shuō)一下:
如圖上標(biāo)記的1所示:
Object[10],Object根據(jù)表中有的數(shù)據(jù)自動(dòng)分配足夠的10個(gè)空間
如圖上標(biāo)記的2所示:
[0],代表的是上面10個(gè)下標(biāo)中的0號(hào)下標(biāo)的值
[0]=Object[2],意思是把Object[2]中的數(shù)據(jù)賦值給上面1中的Object[0]:這里體現(xiàn)了分表存儲(chǔ),下面再說(shuō)
如圖上標(biāo)記的3、4所示:
Object[2]中又存儲(chǔ)著兩個(gè)實(shí)體類SysClasses和SysTeacher
以上證明,有幾張表的話就自動(dòng)劃分成幾個(gè)實(shí)體類存放到Object中:
我們可以做一下測(cè)試,看到底是不是這樣自動(dòng)分配的:
果然,在我又新添加一個(gè)查詢列表SysUserLogin之后,下面箭頭處的Object有3條數(shù)據(jù)了
所以說(shuō)呢,我們?cè)谇芭_(tái)用List對(duì)象.屬性的方式是取不出來(lái)的,因?yàn)長(zhǎng)ist對(duì)象是一個(gè)Object類型
jsp頁(yè)面的部分代碼如下:
<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轉(zhuǎn)換成SysClasses呢?前提說(shuō)好,是不能將Object轉(zhuǎn)換成SysClasses,但是我們可以這樣做
代碼實(shí)例如下:
@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();//將查出來(lái)的某一條記錄放到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)的時(shí)候包括a[0]SysClasses a[1]SysTeacher,如之前圖的講解slist.add((SysClasses) a[0]);//將list.get(0)中的兩個(gè)實(shí)體類分別放到Object[0]和Object[1]中,每一次都將SysClasses取出來(lái)即a[0],放到List<SysClasses> slist}session.close();return slist;}代碼詳細(xì)講解:
我們的目的是每次都取到紅色箭頭處這個(gè)實(shí)體類:上代碼一行一行來(lái)
第一輪for循環(huán)
Object[] a = (Object[]) list.get(i);
list.get(0)的值為 [0]=Object[2] (id=159)這個(gè)整體,這里面還有值。將其賦給a對(duì)象
slist.add((SysClasses) a[0]);
a[0]為SysClasses下面的所有數(shù)據(jù)
最終添加到slist這個(gè)List類型的對(duì)象中
第二輪for循環(huán)
Object[] a = (Object[]) list.get(i);
list.get(1)的值為 [1]=Object[2] (id=160)這個(gè)整體,這里面還有值。將其賦給a對(duì)象
slist.add((SysClasses) a[0]);
a[0]為SysClasses下面的所有數(shù)據(jù)
最終添加到slist這個(gè)List類型的對(duì)象中
以此類推哈!
這樣我們就能取到值了
如果此文對(duì)你有幫助記得點(diǎn)贊哦!轉(zhuǎn)載請(qǐng)附上博主文章地址
https://mp.csdn.net/mdeditor/103286771
總結(jié)
以上是生活随笔為你收集整理的[Ljava.lang.Object; cannot be cast to com.gxuwz.check.entity.SysClasses的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Invocation of init m
- 下一篇: WARN [com.mchange.v2