質問

私は、Hibernateで、次の名前付きクエリを持っています

<sql-query name="CreateLogTable">
  CREATE TABLE IF NOT EXISTS :tableName (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `url` VARCHAR (750) NOT NULL, 
    `query` VARCHAR (500), 
    `ipaddress` VARCHAR (39), 
    `datetime` DATETIME NOT NULL, 
    `hits` MEDIUMINT UNSIGNED DEFAULT '0' NOT NULL, 
    `path_id` VARCHAR (8), 
    PRIMARY KEY(`id`),
    UNIQUE(`id`),
    INDEX(`id`,`query`,`datetime`,`path_id`)
  ) TYPE = MyISAM
</sql-query>

私は次の行を(定数項目を修正するポイント)を使用して、この行を実行しようとしています

getSession().getNamedQuery(CREATE_SQL).setString(CREATE_SQL_TABLE_NAME_PARAM, "wibble").executeUpdate();
私はコードを実行したときに

は、今、私は引用符で囲ま出ているテーブル名について、SQLエラーを取得します:

CREATE TABLE IF NOT EXISTS 'wibble' (
私は、生成されたクエリを取り、テーブル名の前後に引用符なしでそれをしようとすると、

は、クエリが正常に動作します。それは私の問題の原因となったものだけ引用符です。

だから私の質問は:私は確かに私のパラメータは引用符で囲まれていないことを確認するためにsetStringの代わりに使用するために何が必要ですか?私は運とsetParameterを試みたと私はAPIから任意のより良い代替手段を見つけることができませんでした。

任意の入力のおかげで、 リー

役に立ちましたか?

解決

私はあなたがテーブル名などのデータベース識別子の名前付きパラメータを使用することができるとは思いません。唯一の値式。それが許された場合は、SQLインジェクション攻撃に対してあなたが受けやすくなるだろう。別の方法として、あなたはJavaでクエリを作成できます。

他のヒント

あなたはどのようなデータベースタイプを使用していますか?一部のデータベースでは大文字と小文字を区別し(実際にはほとんどがMicrosoftのを除いている)です。だから、「wibble」という名前のテーブルには、「WiBbLe」と「WIBBLE」からまだ違うと異なっている。

あなたが引用符なしでwibbleという名前のテーブルを作成すると、

、Oracleなどのほとんどのデータベースは、すべて大文字「WIBBLE」に指定されたテーブルとしてこれを作成します。あなたはそれを照会するとき、あなたがここにそうであるようにあなたはそれを使用します:

SELECT * FROM wibble

データベースが「WIBBLE」と問題がないとしてこれを解釈します。

永続性プロバイダは、常に引用符でこれを入れているようです。それは次のように作成されたものと同じ引用符付きの名前を作るために、あなたはそれを活用すべきです。だから、これを試してみます:

getSession().getNamedQuery(CREATE_SQL).setString(CREATE_SQL_TABLE_NAME_PARAM, "WIBBLE").executeUpdate();

という引用符でwibbleと同じでなければなりません「WIBBLE」で文を作成する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top