2013-01-12 99 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; 
} 
相關問題