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.

4

2 回答 2

5

当您进行这样的选择时:

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

Hibernate 默认返回 a List<Object[]>,因为这是表示给定字段子集的最安全方式,这些字段绝不一定具有相同的类型(因此,考虑了最低的公共类Object)。

但是,在特定情况下,您可以通过简单的迭代或通过使用配置将结果转换为地图。IMO 这似乎是一种徒劳的练习,因为每条记录都将以一种key - Value时尚的方式返回(即使它表示为两个对象的数组)。

通过直接执行此操作来避免此类开销(更改 的类型roleList):

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

Hibernate 返回的Object[]值尊重所选字段的顺序,因此在您的情况下, index0对应于Id1to Name

于 2013-10-15T14:10:20.683 回答
0

您可以在查询中添加 ResultTransformer 来完成此操作。不过,我不确定是否有一个可以满足您的要求。您可能需要自己编写。不过,它看起来相当简单。我认为您只需要扩展 BasicTransformerAdapter 并覆盖 transformTuple 方法以返回地图。这应该允许您控制从 query.list() 返回的值,以便您可以直接在 MappingBean 上设置它。

于 2013-10-15T14:02:20.913 回答