<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 325,  comments - 25,  trackbacks - 0

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

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

    Hibernate執行sql語句


    Hibernate執行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());// 從這個輸出結果可以看出,objects[j]的
    值實際上是AccountInfo的屬性(表的字段)而不是AccountInfo對象,
    }
    System.out.println(objects.length);
    }
    信息: java.lang.ClassCastException:Ljava.lang.Object; cannot be cast to net.yjiasoft.sss.table.AccountInfo
    分析:原來是查詢出來的字段并不能自動轉換為bean對象,所以要添加addEntity(Clazz class)。
    擴展:
    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必須與數據庫中的字段名一模一樣。
    2.可以用作函數方面的。如
    Query query = session.createSQLQuery("select sum(id) SUMID from Tree t where pid in (select id from Tree)
    .addScalar("SUMID",Hibernate.INTEGER)  //轉換類型,按DB中的type轉
    .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); //返回一個map,KEY:為DB中名稱一致(大小寫一致)
    直接就map.get("SUMID")可以取值了
    還有一點就是這個方法在Hibernate3.2版本上才能正常運行。
    3.hibernate 中createQuery與createSQLQuery兩者區別是:
    前者用的hql語句進行查詢,后者可以用sql語句查詢
    前者以hibernate生成的Bean為對象裝入list返回
    后者則是以對象數組進行存儲
    所以使用createSQLQuery有時候也想以hibernate生成的Bean為對象裝入list返回,就不是很方便
    突然發現createSQLQuery有這樣一個方法可以直接轉換對象
    Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);
    XXXXXXX 代表以hibernate生成的Bean的對象,也就是數據表映射出的Bean。
    呵呵以后多注意,還是時不時的要看看hibernate各個對象方法的使用。
    還有另外一個相關的小細節應注意:
    比如有這樣一個po
    PO: User.class
    properties: userId,userName
    DDL: create table tuser (userid varchar(10),username varchar(20));
    當執行:
    session.createQuery("from User u").list()時生成的SQL:
    select userid,username from tuser;
    當執行:
    session.createQuery("from User u").iterator()時生成的SQL:
    select userid from tuser;
    可以看出list()一次將數據從數據庫中讀出直接填充到List中
    iterator()將數據的主鍵從數據庫中讀出,當循環這個Iterator時才添加執行:
    select userid,username from user where userid=?;把數據讀出。
    在不同的應用范圍使用不同的方法,具體在hibernate應用中應當注意。
    轉:http://blog.163.com/ygm0104@126/blog/static/169767488201271511240611/



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

     

    長春語林科技歡迎您!

    常用鏈接

    留言簿(6)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊

    收藏夾

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 精品在线观看免费| 国产精品亚洲一区二区无码| 国产拍拍拍无码视频免费| 亚洲国产激情一区二区三区| 瑟瑟网站免费网站入口| 四虎成人精品在永久免费| 黄色网址大全免费| 亚洲午夜无码AV毛片久久| 国产精品黄页免费高清在线观看| 国产自偷亚洲精品页65页| 国产精品免费一区二区三区四区| 久久亚洲AV成人出白浆无码国产 | 免费一区二区无码东京热| 在线a亚洲v天堂网2019无码| 中文字幕不卡高清免费| 久久亚洲日韩看片无码| 中文字幕人成无码免费视频| 亚洲av无码成人精品国产| 亚洲AV无码乱码在线观看性色扶| 国产日韩久久免费影院| 亚洲综合区图片小说区| 女人18毛片水真多免费看| 免费精品视频在线| 久久夜色精品国产嚕嚕亚洲av| 一区二区免费视频| 亚洲中文无码亚洲人成影院| 亚洲av无码专区在线观看素人| 香蕉免费看一区二区三区| 亚洲人成电影在线观看青青| 四虎永久免费网站免费观看| 爽爽爽爽爽爽爽成人免费观看| 亚洲精品资源在线| 亚洲成A人片在线观看无码3D | 亚洲国产精品综合久久2007| 国产高清在线免费视频| 国色精品va在线观看免费视频| 亚洲剧情在线观看| 国产亚洲精品影视在线产品| 日韩版码免费福利视频| 人碰人碰人成人免费视频| 91亚洲国产成人久久精品|