从hibernate查询中获取java.util.map列表形式的结果

时间:2013-10-15 13:49:09

标签: java spring hibernate struts2

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中有什么办法我们可以以List of Maps的形式获取数据吗?我的roleList采用地图的形式,我想设置roleList

2 个答案:

答案 0 :(得分:5)

当您选择这样的选择时:

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

Hibernate默认返回List<Object[]>,因为这是表示给定子字段的最安全的方式,它们决不会被绑定为相同的类型(因此,最低的公共类被认为是{{1} })。

但是,根据具体情况,您可以使用简单的迭代或使用配置将结果转换为地图。 IMO它似乎就像一个徒劳的练习,因为每个记录都将以Object方式返回(即使它被表示为两个对象的数组)。

通过直接(更改key - Value的类型)

来避免这种开销
roleList

Hibernate返回的for (Object[] role : roleList) { roleMap.put((Integer)role[0]), (String)role[1]); } 尊重所选字段的顺序,因此,在您的情况下,索引Object[]对应0Id对应1

答案 1 :(得分:0)

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