【问题标题】:How to get map as result of HQL如何获取地图作为 HQL 的结果
【发布时间】:2013-10-04 12:45:21
【问题描述】:

我需要应该返回地图结果的 hql 查询,我尝试了 hql new map 查询,但它返回的地图列表如下

    Session session = sessionFactory.getCurrentSession();
    String HQL_QUERY = "select new map(user.id as id, user.fullName as fullName)
    from User user";
    List<Map<String,String>> usersList = session.createQuery(HQL_QUERY).list();

如果这是唯一的解决方案,那么我如何在不循环的情况下将地图列表转换为单个地图,因为如果查询返回更多行,则循环需要更多时间进行转换。帮帮我。

【问题讨论】:

    标签: java hibernate collections map hql


    【解决方案1】:

    你可以像下面这样使用地图

    Query query = session.createQuery("select new map(id,username) from UserDetails");
    List<?> idUsernameList=query.list();
    Iterator<?> iterator = idUsernameList.iterator();
    Map row=null;
    while(iterator.hasNext()){
       row=(Map)iterator.next();
       System.out.println(row);
    
    }
    

    【讨论】:

      【解决方案2】:

      我建议使用Criteria,然后使用结果转换器来创建地图。查看this 获取官方文档。这给了你一个线索,你可以在网上找到更多的样本。

      【讨论】:

      • 嗨@Ean 谢谢你的回答,但它与我发布的相似。获取地图列表并对其进行迭代。当我有更多行时成本更高,如果我有数百万用户,那么迭代需要更多时间。
      • 如果您有数百万条记录,您不想将它们全部加载到内存中,是吗?如果是,我建议重新考虑您的方法。不过,Hibernate 不是加载大量数据的合适框架。您需要限制查询或使用分页。
      【解决方案3】:

      创建地图不是 HQL 的工作。这是你的工作。只需遍历从查询中获得的行:

      String hql = "select user.id, user.fullName from User user";
      List<Object[]> rows = session.createQuery(hql).list();
      Map<String, String> result = new HashMap<>();
      for (Object[] row : rows) {
          result.put((String) row[0], (String) row[1]);
      }
      

      【讨论】:

      • 感谢您的回复,如果我有数百万用户,那么循环需要更多时间来加载,这就是为什么要询问任何其他解决方案。谢谢
      • 你认为 Hibernate 如何在不循环返回的行的情况下创建地图? Hibernate 是 Java 代码,就像你的一样。它不会神奇地更有效,因为 Hibernate 循环而不是您的代码。您正在预优化。做你必须做的事,并且只在你有问题的时候进行优化,并且在你有问题的地方进行优化。如果有一天你真的有数百万用户,那么创建地图的循环将是你的问题最少的问题。
      • 我知道循环是我在查询中提到的解决方案,只是要求知道休眠在这种情况下有什么魔法。如果是的话,它对我很有用,并且在这种情况下确实需要预优化,因为我在应用程序的大部分地方都使用了地图。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 2016-04-06
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      相关资源
      最近更新 更多