1

使用できるように、テーブル名を動的に設定する必要がありますquery.setText(tname,abc)

例えば:select a.name from :tname where a.id = '2'

文字列パラメーターを設定するときに Hibernate が '' を追加すると想定しているsetText()ため、使用setString()すると " " と表示されるため、使用しました。tname is a invalid parameter

しかし、それでもsetText()役に立たず、同じ例外が発生します。

テーブル名を動的に設定するにはどうすればよいですか?

PSR への返信:

つまり、テーブル名を Java 文字列の置換として置き換えるということです。しかし、休止状態からSQLインジェクション防止などのサポートを受けることはできませんよね? また、ステートメントのような状況で休止状態でパラメーターをバインドする方法、

例: 「%:name%」のような名前

これにより、不正な引数の例外も発生します。 query.setString(name,"def"); を使用してバインドしようとすると、パラメーターは名前付きパラメーターとして存在しません。

4

2 に答える 2

4

Hibernate はPreparedStatements で動作するため、これを行いません。クエリ対象のテーブルがまだ不明なステートメントを準備することはできません。

テーブル名をエンドユーザーに公開する理由がわかりません。そのため、通常の文字列置換を行う SQL インジェクションを防ぐのは簡単なはずです。ある種のビジネス ロジックを使用して、自分だけが知っているリストから正しいテーブルを判断します。テーブル名は、ユーザー入力に由来するものではありません。

選択した RDBMS によっては、異なるテーブルに対して同一のクエリが行われる状況を処理するためのより良い方法として、ディスクリミネーター列、またはパーティショニングを使用したテーブル継承が見つかる場合があります。

于 2013-06-09T05:03:15.643 に答える
1

テーブル名を動的に設定することはできません。列名を動的に設定できます。テーブル名を設定することはできません。

このようにしてみてください

select a.name from '+table name+'where a.id = '2'
于 2013-06-09T02:18:36.193 に答える