少年阿賓

          那些青春的歲月

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

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

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

            の:hql查詢多表部分字段,select new 包名.表1實體類名(表1.屬性1,表2.屬性2……) from 表1實體類,表2實體類 where 表1.ID=表2.ID(即相關(guān)聯(lián)的字段),同時在要返回的表1實體類中添加表2的屬性和帶參的構(gòu)造方法,參數(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對象 









          關(guān)于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,里面定義這四個結(jié)果集里面的字段,能不能執(zhí)行完這條hql,正好把這個結(jié)果集對應(yīng)到實體類Result里面呢,Result這個實體類,沒寫映射文件Result.hbm.xml. 
          希望能幫下忙 

          2種做法 
          創(chuàng)建一個class temp 
          有屬性sid,name,tid,sname,tname 
          創(chuàng)建一個構(gòu)造函數(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兄弟的文章,正好解決了當(dāng)前遇到的問題。原文鏈接如下:http://glamey.iteye.com/blog/721019
                  假設(shè)我們現(xiàn)在有一個DTO,其屬性包括兩張表的屬性,我們現(xiàn)在需要將sql語句查詢得到的內(nèi)容轉(zhuǎn)為一個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后面的內(nèi)容必須和PostVO中屬性名一致,這樣就可以返回一個針對PostVO的一個集合。 
                  其實大家可以看下hibernate這一部分的源碼就會發(fā)現(xiàn),主要是使用了AliasToBeanResultTransformer這個類,通過sql的查詢,會返回數(shù)組,然后hibernate根據(jù)數(shù)據(jù)表的映射,自動幫我們來set對應(yīng)的字段屬性,所以標(biāo)紅的部分務(wù)必要跟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ù)的構(gòu)造方法,并且HQL語句中屬性的位置要與構(gòu)造方法中的位置一一對應(yīng)。 
          posted on 2012-10-25 14:32 abin 閱讀(21372) 評論(4)  編輯  收藏 所屬分類: hibernate

          Feedback

          # re: Hibernate hql 查詢指定字段并獲取結(jié)果集 2013-05-23 11:33 訂單
          訂單  回復(fù)  更多評論
            

          # re: Hibernate hql 查詢指定字段并獲取結(jié)果集[未登錄] 2013-05-26 22:36
          如果其中包含實體類呢,也就是讓Problem實體類里,添加一個實體A  回復(fù)  更多評論
            

          # re: Hibernate hql 查詢指定字段并獲取結(jié)果集[未登錄] 2015-03-25 13:12 Bin
          樓主的名字閃瞎雙眼~  回復(fù)  更多評論
            

          # re: Hibernate hql 查詢指定字段并獲取結(jié)果集 2016-04-29 15:46 搜索
          樓主999999999999999999999999  回復(fù)  更多評論
            

          主站蜘蛛池模板: 西藏| 剑河县| 英山县| 叙永县| 巴塘县| 新巴尔虎左旗| 阿巴嘎旗| 阿瓦提县| 子长县| 南平市| 江油市| 来凤县| 富阳市| 广灵县| 马山县| 山丹县| 宁城县| 余干县| 渑池县| 理塘县| 丰都县| 三亚市| 永胜县| 富平县| 大埔县| 东安县| 江津市| 尖扎县| 克什克腾旗| 商河县| 瑞安市| 托里县| 隆回县| 兴和县| 红原县| 香河县| 黄冈市| 策勒县| 永定县| 合作市| 金寨县|