posts - 325,  comments - 25,  trackbacks - 0

          做項(xiàng)目的時候遇到這樣的問題,hibernate執(zhí)行SQL語句返回來的list集合調(diào)試斷點(diǎn)的時候檢查list集合有值,但是返回action遍歷的時候在list.get(i);這句話時報異常,調(diào)試結(jié)果是list集合為空,查找到的結(jié)果就是用SQL語句不能自動轉(zhuǎn)換成bean對象,所以要轉(zhuǎn)換成數(shù)組形式在進(jìn)行遍歷,這時返回的list集合里的值就可以遍歷出來了.

          偷個懶把別人的代碼粘過來了,還有個錯誤沒有寫,有時間在總結(jié)吧:

          Hibernate執(zhí)行sql語句


          Hibernate執(zhí)行sql語句:
          BasicServiceImpl basicServiceImpl = new BasicServiceImpl();
          String hql = "select * from AccountInfo where selfId='0000100003' or(left(selfId,10)='0000100004' and 
          nodeSum=0)";

          *寫SQL語句的時候做好給表名起個別名

          TManager tManager = TManagerImpl.getInstance();
          List accountList = tManager.getSession().createSQLQuery(hql).list();
          //List accountList = tManager.getSession().createSQLQuery(hql).addEntity(AccountInfo.class).list();
          for(int i=0;i<accountList.size();i++){
          Object[] objects = (Object[])accountList.get(i);
          for(int j=0;j<objects.length;j++){
          System.out.println(objects[j].getClass().getName());// 從這個輸出結(jié)果可以看出,objects[j]的
          值實(shí)際上是AccountInfo的屬性(表的字段)而不是AccountInfo對象,
          }
          System.out.println(objects.length);
          }
          信息: java.lang.ClassCastException:Ljava.lang.Object; cannot be cast to net.yjiasoft.sss.table.AccountInfo
          分析:原來是查詢出來的字段并不能自動轉(zhuǎn)換為bean對象,所以要添加addEntity(Clazz class)。
          擴(kuò)展:
          1.SQL返回一個Map對象,也就是說在在list里包含多個Map,代碼如下
          Query query = session.createSQLQuery("select id,name from Tree t where pid in (select id from Tree) ").setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); //返回一個map,KEY:為DB中名稱一致(大小寫一致)遍歷list時就可以
          Map map = (Map)list.get[i];
          map.get("id");map.get("name");來取值。按你的SQL語句select后的字段名來作為map的Key,但這個key必須與數(shù)據(jù)庫中的字段名一模一樣。
          2.可以用作函數(shù)方面的。如
          Query query = session.createSQLQuery("select sum(id) SUMID from Tree t where pid in (select id from Tree)
          .addScalar("SUMID",Hibernate.INTEGER)  //轉(zhuǎn)換類型,按DB中的type轉(zhuǎn)
          .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); //返回一個map,KEY:為DB中名稱一致(大小寫一致)
          直接就map.get("SUMID")可以取值了
          還有一點(diǎn)就是這個方法在Hibernate3.2版本上才能正常運(yùn)行。
          3.hibernate 中createQuery與createSQLQuery兩者區(qū)別是:
          前者用的hql語句進(jìn)行查詢,后者可以用sql語句查詢
          前者以hibernate生成的Bean為對象裝入list返回
          后者則是以對象數(shù)組進(jìn)行存儲
          所以使用createSQLQuery有時候也想以hibernate生成的Bean為對象裝入list返回,就不是很方便
          突然發(fā)現(xiàn)createSQLQuery有這樣一個方法可以直接轉(zhuǎn)換對象
          Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);
          XXXXXXX 代表以hibernate生成的Bean的對象,也就是數(shù)據(jù)表映射出的Bean。
          呵呵以后多注意,還是時不時的要看看hibernate各個對象方法的使用。
          還有另外一個相關(guān)的小細(xì)節(jié)應(yīng)注意:
          比如有這樣一個po
          PO: User.class
          properties: userId,userName
          DDL: create table tuser (userid varchar(10),username varchar(20));
          當(dāng)執(zhí)行:
          session.createQuery("from User u").list()時生成的SQL:
          select userid,username from tuser;
          當(dāng)執(zhí)行:
          session.createQuery("from User u").iterator()時生成的SQL:
          select userid from tuser;
          可以看出list()一次將數(shù)據(jù)從數(shù)據(jù)庫中讀出直接填充到List中
          iterator()將數(shù)據(jù)的主鍵從數(shù)據(jù)庫中讀出,當(dāng)循環(huán)這個Iterator時才添加執(zhí)行:
          select userid,username from user where userid=?;把數(shù)據(jù)讀出。
          在不同的應(yīng)用范圍使用不同的方法,具體在hibernate應(yīng)用中應(yīng)當(dāng)注意。
          轉(zhuǎn):http://blog.163.com/ygm0104@126/blog/static/169767488201271511240611/



          posted on 2015-08-12 09:30 長春語林科技 閱讀(267) 評論(0)  編輯  收藏 所屬分類: hibernate
          <2015年8月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

           

          長春語林科技?xì)g迎您!

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 响水县| 南丹县| 石嘴山市| 泰宁县| 南和县| 青州市| 滕州市| 杭锦旗| 四子王旗| 浙江省| 项城市| 德清县| 石林| 元江| 鄱阳县| 乌兰浩特市| 扶风县| 宁南县| 桐庐县| 昌乐县| 灵台县| 磐安县| 垫江县| 台北县| 阳朔县| 乾安县| 仙居县| 中方县| 措勤县| 邢台市| 娄烦县| 尚义县| 佳木斯市| 安陆市| 石城县| 东兰县| 明溪县| 常山县| 凉城县| 黑水县| 达州市|