如何从Java中获取Hibernate查询结果中的列名?

Fra*_*ank 5 java hibernate names

我正在编写一个使用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());
Run Code Online (Sandbox Code Playgroud)

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

它指向1st for循环,因为我是Hibernate的新手,不知道它是否可行,如何修复上面的代码?有人可以告诉我一些在我的案例中有效的示例代码吗?

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

Mar*_*tör 1

虽然不太明白,但还是敢回答...

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

如果您从文本区域获得的是纯 SQL,那么您必须使用session.createSQLQuery(sql). 您返回的是对象数组的列表。然而,在这里您也只能获得数据。您必须禁止您的用户使用select *查询。然后您可以使用查询中的字段/列的名称作为输出列名称。