5

私は 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());

次のエラーメッセージが表示されました: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: sakila.entity.Actor cannot be cast to java.util.Map

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

編集: Marcel Stör が以下で述べたように、両方の状況が発生することを許可し、ユーザーがデータを照会する能力を制限しないようにする必要があります。それを行う最善の方法は何ですか?

4

3 に答える 3

1

よくわかりませんが回答お願いします...

このようにHQLを使用する場合、デフォルトで個々のフィールドではなくオブジェクトQuery q=session.createQuery(hql);を取得することをお勧めします。これは、とにかく結果をクエリにマップし直そうとしても運が悪いことを意味しますが、オブジェクトのフィールド名を列名として使用することはできます。

ただし、テキスト領域から得られるものがプレーン SQL の場合は、session.createSQLQuery(sql). 返されるのは、オブジェクト配列のリストです。ただし、ここでもデータのみを取得します。select *ユーザーがクエリを使用することを禁止する必要があります。次に、クエリのフィールド/列の名前を出力列名として使用できます。

于 2013-01-12T20:25:26.153 に答える
1

次のようなHQLクエリにも同じ種類の問題があります

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

ビューDTOとして使用する

1 つ以上のレコードを使用して、の要素であるマップを反復処理できます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;
}
于 2013-05-21T08:53:10.123 に答える
0

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

ユーザーが HQL クエリを入力した場合は、 を呼び出すことができますhqlQuery.getReturnTypes()。その後、タイプごとに、この投稿で提案されていることを実行して、テーブルのメタデータを見つけることができます。

于 2013-01-13T00:40:48.367 に答える