hql投影查询之—— [Ljava.lang.Object; cannot be cast to cn.bdqn.guanMingSys.entity.Notice
???? 最近在做項目中遇到一個簡單的問題,但是解決了好久,問題就是投影查詢。
先來看看出現的異常:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to cn.bdqn.guanMingSys.entity.Notice
?? ?at cn.bdqn.guanMingSys.dao.impl.NoticeDaoImpl.getNoticeByMaxDate(NoticeDaoImpl.java:138)
?? ?at cn.bdqn.guanMingSys.service.impl.NoticeServiceImpl.getNoticeByMaxDate(NoticeServiceImpl.java:132)
?? ?at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
?? ?at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
?? ?at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
?? ?at java.lang.reflect.Method.invoke(Method.java:606)
?? ?at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
?? ?at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
....................
后面的省略一大推看不懂的東西。。。
很顯然,問題的本質是轉換失敗。看看我寫的hql語句:
查詢最大的日期和名稱,就是因為太懶,知道這是個投影查詢,就是不想用,哎。。。。
我先在數據庫里面查詢了一遍,沒問題,就沒改這個hql語句,以為可以直接使用!
直到在單元測試里面測試了一遍,出錯。。。。。
轉換異常嘛!好說,我改:
/*** (非 Javadoc)* <p>Title: getNoticeByMaxDate</p>* <p>Description(描述):最近發布的公告 </p>* @return* @see cn.bdqn.guanMingSys.dao.INoticeDao#getNoticeByMaxDate()*/@Overridepublic Notice getNoticeByMaxDate() {Notice notice = new Notice();String hql = "select new Notice (MAX(noticedate),noticename) from Notice";Session session = this.getSession();List<Object[]> noticeList = session.createQuery(hql).list();for (Object[] obj : noticeList) {System.out.println(obj[0]);notice = (Notice) obj[0];}return notice;}我再改: @Overridepublic Notice getNoticeByMaxDate() {String hql = "select MAX(noticeid) from Notice";Session session = this.getSession();Notice notice = (Notice) session.createQuery(hql).uniqueResult();return notice;}
我繼續改: @Overridepublic Notice getNoticeByMaxDate() {Notice notice = null;String hql = "select MAX(noticeid) from Notice ";Session session = this.getSession();List<Notice> noticeList = session.createQuery(hql).list();if(noticeList.size()!=0){notice = noticeList.get(0);}return notice;}.......
改了大概10幾遍。我上翻Google,下翻百度!!!左進Statick Overflow,右逛csdn.然而并沒有什么卵用!!!
機智的我就去群成員2000左右的java群里面滿懷激動的問了一下此問題。
臥槽,群里人還是該吹牛逼的吹牛逼,改撩妹的撩妹!!!居然不鳥我。。。。。(能不求人的盡量不求人!要想不求其他人,自己先強于其他人!)
看來還是得靠自己嘍。上個廁所在說吧!!!還別說,多虧這個上廁所這個bug得以解決。。。在上廁所的路上邊走邊想這個bug,要不用投影查詢試試?還試個啥啊,這tmd就是頭應查詢啊,趕緊在廁所解決完就回來寫!
??? 于是,我在一次的對我的代碼進行了更改!!!
改為:
@Overridepublic Notice getNoticeByMaxDate() {Notice notice = new Notice();String hql = "select new Notice (noticename,MAX(noticedate)) from Notice";Session session = this.getSession();List<Notice> noticeList = session.createQuery(hql).list();if(noticeList.size()!=0){notice = noticeList.get(0);}return notice;}激動的去運行了一下,,,果不其然的得到如下結果:
??? 控制太的錯誤信息:
[cause=org.hibernate.PropertyNotFoundException: no appropriate constructor in class: cn.bdqn.guanMingSys.entity.Notice]????? 對于現在的我來說,雖然報錯,,,,但是錯誤換了也好說,總比之前的錯誤好(沒有一點點解決的余地),出現以上的錯誤,怪我英文水平不行,那就去谷歌唄,看看谷歌怎么說:
? 哦哦,他和我說是缺少個構造函數,現在的hql語句的new里面有兩個字段,noticename和noticedate,因為構造函數只有全參的和無參的,所以不對應!!!然后我將信將疑的加了個構造函數,懷著一顆緊張又激動的心去點了一下它,哥們,行不行就靠你了今晚讓我幾點睡全靠您老的心情了,網開一面讓我早點睡吧,明天我還有課呢。。。。神叨叨了半天程序運行完了!行完了!!完了!!!了!!
打開控制臺一看:
哈哈哈哈,可以了!!!重新回頭看看hql語句的那。。。。原來是這樣的!!!
總結
以上是生活随笔為你收集整理的hql投影查询之—— [Ljava.lang.Object; cannot be cast to cn.bdqn.guanMingSys.entity.Notice的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用JDBCTemplate实现与Spr
- 下一篇: 电脑还需要安装杀毒软件吗现在电脑要装杀毒