【问题标题】:With Hibernate, how can I query a table and return a hashmap with key value pair id>name?使用 Hibernate,如何查询表并返回键值对 id>name 的 hashmap?
【发布时间】:2011-06-11 19:49:57
【问题描述】:

我有这张桌子:

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

我想用休眠机制查询这个表(使用第二级缓存)。 hibernate查询的结果必须是一个hash map,key是字段id,value是字段名。

如何用 HQL 编写它?

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

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

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

1>Jerome
2>Steve
3>Nick

谢谢

【问题讨论】:

    标签: sql hibernate hql


    【解决方案1】:

    这个问题很老,但这可能仍然对其他人有所帮助。 您现在可以使用 HQL 通过休眠返回地图。 使用这样的东西:

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

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

    【讨论】:

    • 大约 1 年 1 月 2 日,我更新了我接受的答案!这正是我搜索的内容。这有点太晚了,但很有用!
    • @JeromeCance 7 年后,我在这里想知道为什么这是公认的答案......你如何将 ID 映射到名称?这只是将别名映射到选定的值。
    【解决方案2】:

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

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

    【解决方案3】:

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

    例如

    使用这个,hibernate 给出键/值对,这意味着返回映射。

    【讨论】:

      【解决方案4】:

      喂……

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

          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】:

        暂时假设 Account 没有任何要加载的非惰性关联,以下是您将获得的最佳性能:

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

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

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

        【讨论】:

          【解决方案6】:

          我认为你能得到的最接近的是使用这个查询:

          select id, name from Account
          

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-04-12
            • 2020-08-08
            • 1970-01-01
            • 1970-01-01
            • 2015-10-11
            • 1970-01-01
            • 2021-11-11
            • 1970-01-01
            相关资源
            最近更新 更多