【问题标题】:How to get column names from Hibernate query result in Java?如何从 Java 中的 Hibernate 查询结果中获取列名?
【发布时间】:2013-01-12 20:05:28
【问题描述】:

我正在编写一个使用 Hibernate 获取数据的 Java 应用程序,在我的应用程序中,我有一个输入文本区域,它接受用户输入的 sql 命令字符串并通过 Hibernate 运行它以获取用户查询的任何数据,所以我事先不知道结果表可能是什么样子,因此不知道列名,但我确实需要在列名与数据字段相关的表中显示用户查询结果,如何在 Hibernate 中实现这一点?我试过以下代码:

  Session session=HibernateUtil.getSession();
  session.beginTransaction();
  Query q=session.createQuery(hql);

  AliasToEntityMapResultTransformer INSTANCE=new AliasToEntityMapResultTransformer();
  q.setResultTransformer(INSTANCE);
  List<Map<String,Object>> aliasToValueMapList=q.list();

  for (Map<String,Object> map : aliasToValueMapList)
    for (Map.Entry<String,Object> entry : map.entrySet()) System.out.println(entry.getKey()+" - "+entry.getValue());

它给了我以下错误消息:线程“AWT-EventQueue-0”中的异常 java.lang.ClassCastException: sakila.entity.Actor 无法转换为 java.util.Map

它指向第一个for循环,因为我是Hibernate的新手,不知道它是否可行,如何修复上面的代码?有人可以向我展示一些适用于我的示例代码吗?

编辑: 正如下面 Marcel Stör 所提到的,我需要能够允许这两种情况发生,并且不限制用户查询任何数据的能力,最好的方法是什么?

【问题讨论】:

    标签: java hibernate names


    【解决方案1】:

    不太明白但还是敢回答……

    如果您像这样使用HQLQuery q=session.createQuery(hql); 建议您返回 objects,而不是默认返回单个字段。这意味着无论如何尝试将结果映射回查询都不走运,但是您可以简单地使用对象的字段名称作为列名称。

    如果你从文本区域得到的是纯 SQL,那么你必须使用session.createSQLQuery(sql)。你得到的是list of object arrays。但是,在这里您也只能获取数据。您必须禁止您的用户使用select * 查询。然后,您可以使用查询中的字段/列的名称作为输出列名称。

    【讨论】:

      【解决方案2】:

      对于像

      这样的 HQL 查询,我也遇到了同样的问题
      select new Map(id as id, name as name) from Person
      

      我用作视图 DTO

      有了一个或多个记录,我可以遍历作为 List&lt;Map&lt;String, Object&gt; 元素的映射。 仅当我需要使用 empty 数据集管理情况时才会出现问题。对于那种情况 像

      public List<String> getAliases(String queryString) {
         ArrayList<String> list = 
             new ArrayList<String>(Arrays.asList(queryString.split("as ")));
         List<String> result = new ArrayList<String>();
         list.remove(0);
         for (String str : list) {
              StringTokenizer st = new StringTokenizer(str, ",) ");
              result.add(st.nextToken());
          }
          return result;
      }
      

      【讨论】:

        【解决方案3】:

        用户输入的是 SQL 还是 HQL 查询?它们之间有很大的不同。

        如果用户输入HQL查询,你可以调用hqlQuery.getReturnTypes(),然后对于每个类型你可以调用whatever suggested in this post来查找表元数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-08
          • 2011-12-16
          • 2019-05-28
          • 1970-01-01
          • 2012-08-29
          • 1970-01-01
          • 2019-01-02
          相关资源
          最近更新 更多