1. 程式人生 > >hibernate將sql或hql查詢結果集對映為實體類 不需要對映檔案

hibernate將sql或hql查詢結果集對映為實體類 不需要對映檔案

   感謝glamey兄弟的文章,正好解決了當前遇到的問題。原文連結如下:http://glamey.iteye.com/blog/721019

        假設我們現在有一個DTO,其屬性包括兩張表的屬性,我們現在需要將sql語句查詢得到的內容轉為一個DTO物件,其解決方法如下: 
Java程式碼  收藏程式碼
  1. 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"    
  2. Query q = factory.getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(PostVO.class
    ));  

        上面select中as後面的內容必須和PostVO中屬性名一致,這樣就可以返回一個針對PostVO的一個集合。 
        其實大家可以看下hibernate這一部分的原始碼就會發現,主要是使用了AliasToBeanResultTransformer這個類,通過sql的查詢,會返回陣列,然後hibernate根據資料表的對映,自動幫我們來set對應的欄位屬性,所以標紅的部分務必要跟VO中的屬性值一直,要不然會報錯的。 
        如果需要的話,大家也可以重寫這個類。例如VOResultTransformer。然後在dao中更改成: 
Java程式碼  收藏程式碼
  1. setResultTransformer(new
     VOResultTransformer(PostVO.class));  


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

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