使用Hibernate,我如何查询表并返回键值对id> name的hashmap?

时间:2011-01-19 14:59:32

标签: sql hibernate hql

我有这张桌子:

table name : Account
Fields : id (varchar), name(varchar), other fields...

我想用hibernate机制查询这个表(使用第二个缓存级别)。 hibernate查询的结果必须是哈希映射,其中键是字段id,值是字段名称。

如何用HQL编写它?

如果我使用map,我只能使用别名,如果我使用带有对象的构造函数,我必须将结果转换为hashmap,这很费时。

Example : 
Id | name | other fields
1 Jerome ...
2 Steve ...
3 Nick ...

查询的结果必须是一个hashmap:

1>Jerome
2>Steve
3>Nick

感谢

6 个答案:

答案 0 :(得分:12)

这个问题很老,但这可能仍然有助于其他人。 您现在可以使用HQL返回带有hibernate的映射。 使用这样的东西:

select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n ) from Cat cat

来自hibernate docs: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-select

答案 1 :(得分:5)

我认为最接近的是使用此查询:

select id, name from Account

它将为您提供两个长度数组的结果集。您必须手动构建地图,如下所示:

for(Object[] row : rs) {
    map.put(row[0], row[1]);
}

请注意,这将在很大程度上忽略二级缓存并转换为SQL查询。

答案 2 :(得分:3)

Hibernate的默认实体模式是EntityMode.POJO。

您可以使用EntityMode.MAP实体模式以Map格式检索查询输出。

答案 3 :(得分:0)

假设目前该帐户没有任何非加密的关联,那么以下是您将获得的最佳性能:

List<Account> accounts = (List) session.createQuery("from Account").list();
for (Account account : accounts) map.put(account.getID(), account.getName());

这可能是“耗时的”,但它并不像Hibernate可以以某种方式神奇地避免将每个返回的行放入地图的步骤。

与其他答案不同,这应该受益于二级缓存。

答案 4 :(得分:0)

... HIII

以下代码可能会对您有所帮助。

    Query query = session.createQuery("select id, name from table");
    List results = query.list();

在对象确实有效时显示结果:

    int i;
    int j;
    Object object = null;
    for (i = 0; i < results.size(); i++) {

        System.out.println("-------");
        Object[] obj = (Object[]) results.get(i);
        for (j=0;j<obj.length;j++)
        {
            System.out.println(obj[j]);
        }
        System.out.println("-------");

    }

编辑:您可以将结果对象用作地图并完成。

答案 5 :(得分:-1)

使用默认实体名称,您可以将实体名称应用于hbm.xml文件。

例如                    

使用它,hibernate给出键/值对,这意味着返回地图。