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

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

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

    巷尾的酒吧

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      64 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks
    在hibernate中,用hql語句查詢實體類,采用list方法的返回結果為一個List,該List中封裝的對象分為以下三種情況:
    1.查詢全部字段的情況下,如"from 實體類",list中封裝的對象為實體類本身,各屬性都將得到填充。
    2.只查詢一個字段,默認情況下,list中封裝的是Object對象。
    3.查詢兩個或兩個以上的字段,默認情況下,list中封裝的是Object[],長度與所查詢的字段數(shù)一致。

    對于后兩種情況,用標簽遍歷時不太方便,因為無法直接轉換成實體類的對象。比較簡單的解決方法是:

    の:在hql中使用select new 包名.類名(屬性1,屬性2……) from 實體類,同時在實體類中添加帶參的構造方法,參數(shù)的個數(shù)和順序與(屬性1,屬性2……) 保持一致,這樣我們得到的list中存放的依然是實體類的對象,所查詢到的屬性得到了填充,使用起來更為方便。

      の:hql查詢多表部分字段,select new 包名.表1實體類名(表1.屬性1,表2.屬性2……) from 表1實體類,表2實體類 where 表1.ID=表2.ID(即相關聯(lián)的字段),同時在要返回的表1實體類中添加表2的屬性和帶參的構造方法,參數(shù)的個數(shù)和順序與(表1.屬性1,表2.屬性 2……) 保持一致

    例如要查詢Problem 中的pid,score,title,totalAccept,totalSubmission,unSee

    public class Problem {  
        private int pid;  
        private int score;  
        private int timeLimit;  
        private int memoryLimit;  
        private int totalAccept;  
        private int totalSubmission;  
        private int unSee;  
        private String title;  
        private String description;  
        private String input;  
        private String output;  
          
        public Problem(int pid, int score,String title, int totalAccept, int totalSubmission,  
                 int unSee) {  
            super();  
            this.pid = pid;  
            this.score = score;  
            this.totalAccept = totalAccept;  
            this.totalSubmission = totalSubmission;  
            this.unSee = unSee;  
            this.title = title;  
        }  
        //省略getter 和 setter   
    }  
    查詢語句如下
          Query query=session.createQuery("select new Problem(pid,score,title,totalAccept,totalSubmission,unSee) from Problem order by pid");  
            //query.setFirstResult(firstResult); //分頁函數(shù)   
            //query.setMaxResults(maxResutl);   
          
            List<Problem> problems=query.list();//返回的還是Problem對象 









    關于hibernate的問題: 
    我現(xiàn)在有條 
    hql="select s.id,s.name,t.id,t.name from User s,Useraddress t where t.id=s.id" 

    這條sql里面的User和Useraddress是兩個實體類,現(xiàn)在組合查詢分別取出來兩個實體類里面的兩個字段,然后我想再建立一個實體類Result,里面定義這四個結果集里面的字段,能不能執(zhí)行完這條hql,正好把這個結果集對應到實體類Result里面呢,Result這個實體類,沒寫映射文件Result.hbm.xml. 
    希望能幫下忙 

    2種做法 
    創(chuàng)建一個class temp 
    有屬性sid,name,tid,sname,tname 
    創(chuàng)建一個構造函數(shù) 
    public temp(sid,name,tid,sname,tname) 



    1.hql中 
    List<temp> 

    select new temp(s.id,s.name,t.id,t.name) from User s,Useraddress t where t.id=s.id 

    2.List 
    記錄的每一行是object[] 遍歷 
    object[0] ==s.id 
    object[1] ==s.name 
    object[2] ==t.id 
    object[3] ==t.name 

     



    感謝glamey兄弟的文章,正好解決了當前遇到的問題。原文鏈接如下:http://glamey.iteye.com/blog/721019
            假設我們現(xiàn)在有一個DTO,其屬性包括兩張表的屬性,我們現(xiàn)在需要將sql語句查詢得到的內容轉為一個DTO對象,其解決方法如下:  

    String sql = "select u.userName as userName ,p.title as title ,p.addTime as addTime from user as u,post as p where u.id=p.userId"  
    Query q = factory.getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(PostVO.class));

          上面select中as后面的內容必須和PostVO中屬性名一致,這樣就可以返回一個針對PostVO的一個集合。 
            其實大家可以看下hibernate這一部分的源碼就會發(fā)現(xiàn),主要是使用了AliasToBeanResultTransformer這個類,通過sql的查詢,會返回數(shù)組,然后hibernate根據(jù)數(shù)據(jù)表的映射,自動幫我們來set對應的字段屬性,所以標紅的部分務必要跟VO中的屬性值一直,要不然會報錯的。 
            如果需要的話,大家也可以重寫這個類。例如VOResultTransformer。然后在dao中更改成:  

    setResultTransformer(new VOResultTransformer(PostVO.class));

      另外,除了以上glamey的方法外,還有一種方法:  
    Query q = session.createQuery("select new com.hibernate.MsgInfo(m.id, m.cont, m.topic.title, m.topic.category.name) from Msg m");
    List<MsgInfo> list=q.list();

         其中,MsgInfo是DTO。值得注意的是,第二種方法中DTO必須提供帶參數(shù)的構造方法,并且HQL語句中屬性的位置要與構造方法中的位置一一對應。 















    posted on 2012-10-25 14:31 abing 閱讀(1042) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 亚洲国产精品综合久久2007| 免费国产成人午夜在线观看| 内射少妇36P亚洲区| 免费一区二区三区四区五区| 最近高清中文字幕免费| 国产精品免费观看视频| 亚洲国产精品美女久久久久| 亚洲最大黄色网站| 五月天网站亚洲小说| 亚洲午夜精品一级在线播放放 | 亚洲国产另类久久久精品小说| 免费无码成人AV片在线在线播放| 69视频在线是免费观看| 97无码人妻福利免费公开在线视频| 日本在线观看免费高清| 亚洲国产成人精品无码区花野真一 | 免费一区二区视频| 免费无码又爽又刺激高潮| 免费在线看v网址| 99re免费在线视频| 久久黄色免费网站| 在线成人精品国产区免费| 91免费在线视频| 久久嫩草影院免费看夜色| 一本到卡二卡三卡免费高| 特黄特色大片免费| 精品视频免费在线| 亚洲黄色免费网站| 18禁成人网站免费观看| 一级毛片免费不卡在线| 国产激情免费视频在线观看| 国产一区二区三区免费观看在线| 国产精品无码免费专区午夜| 精品无码一级毛片免费视频观看 | 免费观看的毛片手机视频| 免费看韩国黄a片在线观看| 毛片免费在线观看网址| 免费看的成人yellow视频| 成年午夜视频免费观看视频| 成人免费无码大片A毛片抽搐色欲| 最新中文字幕免费视频|