2013-10-15 37 views
0
final List <Map<String , Object>> roleList; 
final Map<Integer, String> roleMap=new HashMap<Integer, String>(); 

roleList = getSession() 
    .createQuery("select Id, Name from Emp where dept=:ref") 
    .setParameter("ref", "accounts") 
    .list(); 

for (Map<String, Object> map2 : roleList) 
{ 
    roleMap.put((Integer)(map2.get("Id")), (String)map2.get("Name")); 
} 

MappingBean.setRoleList(roleMap); 

上面的代碼顯示了類別轉換異常[Ljava.lang.Object; cannot be cast to java.util.Map。 Hibernate中有什麼方法可以以地圖列表的形式獲取數據嗎?我的roleList是以地圖的形式,我想設置roleList從休眠查詢中獲取java.util.map列表的形式

+1

你的* roleList *究竟是什麼類型? –

+0

查看'Criteria.ALIAS_TO_ENTITY_MAP' –

+0

@EelLee它是字符串映射類型和對象 –

回答

5

當你做出一個選擇這樣的:

.createQuery("select Id, Name from Emp where dept=:ref") 

默認爲List<Object[]> Hibernate的回報,因爲這代表的是絕非必然有相同類型的字段的一個給定的子集(最安全的方法因此,最低等級被認爲是Object)。

然而,您可以通過簡單的迭代或通過使用配置將結果轉換爲映射。 IMO it 好像就像徒勞無益,因爲每個記錄都會以key - Value的方式返回(即使它被表示爲兩個物體的數組)。

通過這樣做,避免自己這樣的開銷,直接(改變roleList類型):

for (Object[] role : roleList) 
{ 
    roleMap.put((Integer)role[0]), (String)role[1]); 
} 

Object[]由Hibernate返回尊重選定字段的順序,這樣,你的情況,指數0對應Id1Name

+0

final List > roleList我的列表的類型是Map,所以y沒有給出錯誤信息 –

+0

@AnkitDuggal因爲您創建了'roleList',但是您沒有爲它指定一個值。 *嘗試*將Hibernate返回的'List '分配給您的'List >'時拋出'ClassCastException'。該錯誤clrearly指出,轉換爲'地圖'失敗。 – Gamb

0

您可以將ResultTransformer添加到您的查詢中以完成此操作。不過,我不確定是否有一款產品能夠滿足您的需求。你可能需要寫你自己的。不過,它看起來相當簡單。我認爲你需要的只是擴展BasicTransformerAdapter並重寫transformTuple方法來返回地圖。這應該允許您控制從query.list()返回的值,以便您可以直接在MappingBean上設置它。

+0

什麼是結果轉換器? –

+0

它是由Hibernate提供的一個類,可用於轉換由Hibernate查詢返回的結果集。它可以讓你以任何你想要返回的格式進行混合。查看org.hibernate.transform.ResultTransformer的javadoc。 –