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

时间:2013-01-12 20:05:28

标签: 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());

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

用户是否输入SQL或HQL查询?这些之间有很大的不同。

如果用户键入HQL查询,您可以调用hqlQuery.getReturnTypes(),然后针对每种类型,您可以whatever suggested in this post查找表元数据。

答案 2 :(得分:0)

我遇到了类似

的HQL查询问题
select new Map(id as id, name as name) from Person

我用作视图DTO

使用一个或多个记录,我可以遍历作为List<Map<String, Object>元素的地图。 仅当我需要使用数据集管理情境时才会出现此问题。对于那种情况

之类的东西
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;
}