Java中使用hql,sql查詢--多表查詢後的新實體構建方法詳解

需要將Query對象setResultTransformer:

List list = session.createSQLQuery(sql).setResultTransformer(
Transformers.ALIAS_TO_ENTITY_MAP).list();
//此時,每個Object可以轉換成一個Map
Map map = (Map) list.get(i);
map.get("PARENT_ID");  //這裏的key 一定是 數據庫對應的字段名才行

例如:

  1. <span style="font-family:Microsoft YaHei;font-size:13px;">// 查詢出數據

  2.  String hql = "select a.id as emergencyBasExeId,a.LEVEL as level,a.SEND_TIME as sender_time,a.NAME as name,a.CONTENT as content " +  

  3. ",a.PROCESS_ID as processId,m.STATES as states,m.id as id,m.emergencyInfoSecondMgr.id as emergencySencondMgrId " +  

  4. " from EmergencyInfoFirstExe a,  EventManage m where a.deleteFlag = 0 and a.id=m.emergencyInfoFirstExe.id ";  

  5. // 查詢出數據list

  6.  List exeList = eventManageDao.notifyHqlPage(hql, pageNumber * pageSize, pageSize);  

  7. // 返回所需要的數據List

  8.  List<EventInfoView> reList = new ArrayList<EventInfoView>();  

  9. //map.get("PARENT_ID");  //這裏的key 一定是 數據庫對應的字段名才行

  10. //對返回List的數據封裝

  11. for(Object exe : exeList){  

  12.   EventInfoView event = new EventInfoView();  

  13. //此時,每個Object可以轉換成一個Map

  14.   Map map=(Map)exe;  

  15. //然後可以使用map.get("屬性名");即可取值

  16.   event.setId(map.get("id").toString());  

  17.   event.setContent(map.get("content").toString());  

  18.   event.setEmergencyBasExeId(map.get("emergencyBasExeId").toString());  

  19.   event.setEmergencySencondMgrId(map.get("emergencySencondMgrId").toString());  

  20.   event.setEmergencyTitle(map.get("emergencyTitle").toString());  

  21.   event.setLevel(map.get("level").toString());  

  22.   event.setName(map.get("name").toString());  

  23.   event.setProcessId(map.get("processId").toString());  

  24.   event.setProcessName(map.get("processName").toString());  

  25.   event.setSender_time(map.get("sender_time").toString());  

  26.   event.setStates(map.get("states").toString());  

  27. //....

  28.   reList.add(event);  

  29.  }  

  30. </span>  


上面的方法經過驗證無效!!!

==============================第二種方法==============================

hql查詢單表部分字段:

在hibernate中,用hql語句查詢實體類,採用list方法的返回結果爲一個List,該List中封裝的對象分爲以下三種情況:

1.查詢全部字段的情況下,如"from 實體類",list中封裝的對象爲實體類本身,各屬性都將得到填充。

2.只查詢一個字段,默認情況下,list中封裝的是Object對象。

3.查詢兩個或兩個以上的字段,默認情況下,list中封裝的是Object[],長度與所查詢的字段數一致。

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

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


hql查詢多表部分字段:

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

在我的項目中事實證明無效,可能對其他有效,可以一試!!!

===========================第三種方法,可以成功,百試不爽!!!==========================

不知道是否還有其他方法實現,請高人指點。

如果涉及到多張表多字段查詢,並且想利用查詢出來的字段在界面層構建一個新的實體類,可以使用這種方法;

如果查詢出來的多字段中,有多個字段的名字都相同(如想查詢出A表的id,B表的id,C表的id),可以使用這種方法;

祕籍:使用Spring實體注入的方式來做就可以了!

比如A表和B表和C表構成一個完整的事件信息,其中C表包含A,B表的關聯id(分別爲A,B表的主鍵)。

那麼你就可以使用C表作爲主要實體,將A,B表的實體注入到C表實體中(我是用的注入方式是getter/setter方法)

然後你可一使用hql查詢出C表實體:select c from C c,B b, A a where c.aid=a.id and c.bid=b.id;(...)

查詢出來後使用List<C>來獲取集合:

List<C> llist=.....;

遍歷clist..

for( C cl:clist){

cl.getA().A表實體的各個字段;

cl.getB().B表實體的各個字段;

你都可以獲取出來,哈哈,終於成功了!!!

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章