hibernate將sql或hql查詢結果集對映為實體類 不需要對映檔案
阿新 • • 發佈:2019-02-04
感謝glamey兄弟的文章,正好解決了當前遇到的問題。原文連結如下:http://glamey.iteye.com/blog/721019
假設我們現在有一個DTO,其屬性包括兩張表的屬性,我們現在需要將sql語句查詢得到的內容轉為一個DTO物件,其解決方法如下:
Java程式碼
上面select中as後面的內容必須和PostVO中屬性名一致,這樣就可以返回一個針對PostVO的一個集合。
其實大家可以看下hibernate這一部分的原始碼就會發現,主要是使用了AliasToBeanResultTransformer這個類,通過sql的查詢,會返回陣列,然後hibernate根據資料表的對映,自動幫我們來set對應的欄位屬性,所以標紅的部分務必要跟VO中的屬性值一直,要不然會報錯的。
如果需要的話,大家也可以重寫這個類。例如VOResultTransformer。然後在dao中更改成:
Java程式碼
另外,除了以上glamey的方法外,還有一種方法:
Java程式碼
其中,MsgInfo是DTO。值得注意的是,第二種方法中DTO必須提供帶引數的構造方法,並且HQL語句中屬性的位置要與構造方法中的位置一一對應。
假設我們現在有一個DTO,其屬性包括兩張表的屬性,我們現在需要將sql語句查詢得到的內容轉為一個DTO物件,其解決方法如下:
Java程式碼
- 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這一部分的原始碼就會發現,主要是使用了AliasToBeanResultTransformer這個類,通過sql的查詢,會返回陣列,然後hibernate根據資料表的對映,自動幫我們來set對應的欄位屬性,所以標紅的部分務必要跟VO中的屬性值一直,要不然會報錯的。
如果需要的話,大家也可以重寫這個類。例如VOResultTransformer。然後在dao中更改成:
Java程式碼
-
setResultTransformer(new
另外,除了以上glamey的方法外,還有一種方法:
Java程式碼
- 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必須提供帶引數的構造方法,並且HQL語句中屬性的位置要與構造方法中的位置一一對應。