2013-01-12 22 views
5

私は、アプリケーションでデータを取得するためにHibernateを使用するJavaアプリケーションを作成しています。ユーザが入力したsqlコマンド文字列を受け取り、Hibernateを通してそれを実行して、結果テーブルがどのように見えるかわからないので、カラム名を知らないのですが、カラム名がデータフィールドに関係するテーブルにユーザのクエリ結果を表示する必要があります。どのようにHibernateでそれを達成するのですか?スレッドの例外「AWT-EventQueueの-0」とjava.lang.ClassCastException:sakila.entity.Actorは、Javaにキャストすることはできませんそれは私に次のエラーメッセージを与えた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()); 

:私は、次のコードを試してみました。 util.Map

これは最初のforループを指しています。私はHibernateを初めて使ったので、それが実行可能かどうか、上記のコードを修正する方法はわかりません。誰かが私のケースで動作するサンプルコードを私に見せてもらえますか?

編集: MarcelStörが以下に述べるように、私は両方の状況が起こることを許可し、ユーザーのデータ照会機能を制限することができないようにする必要があります。

答えて

1

私はかなり理解して、まだ答えることをあえてしないでください...

あなたはこのQuery q=session.createQuery(hql);ようHQLを使用している場合は、デフォルトでバックオブジェクトではなく、個々のフィールドを取得示唆しています。これは、結果をクエリに戻してマップしようとしているにも関わらず、オブジェクトのフィールド名を単に列名として使うことができます。

テキスト領域から得られるものが普通のSQLである場合は、session.createSQLQuery(sql)を使用する必要があります。返されるのはlist of object arraysです。ただし、ここでもデータを取得するだけです。ユーザーがselect *のクエリを使用することを禁止する必要があります。次に、クエリのフィールド/カラムの名前を出力カラム名として使用できます。

0

ユーザーはSQLクエリまたはHQLクエリで入力しますか?それらの間には大きな違いがあります。

ユーザーがHQLクエリを入力する場合、hqlQuery.getReturnTypes()を呼び出してから、それぞれのタイプに対してwhatever suggested in this postを実行してテーブルのメタデータを調べることができます。

0

は、私は私がList<Map<String, Object>の要素であるマップを反復処理できる1つ以上のレコードを持つビューDTOとして

を使用

select new Map(id as id, name as name) from Person 

ようHQLクエリの問題の同じ種類を持っています。 が空の状況を管理する必要がある場合にのみ問題が発生するデータセット。その場合、 のようなもの

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; 
} 
関連する問題