2013-01-12 100 views
5

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

它指向1st for循环,因为我是Hibernate的新手,不知道它是否可行,如何修正上面的代码?有人能告诉我一些适用于我的情况的示例代码吗?

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

回答

1

我不太了解,但仍敢回答...

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

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

0

用户是否在SQL或HQL查询中键入?这些之间有很大的区别。

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

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; 
} 
相关问题