1

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からこれ以上の代替手段を見つけることができませんでした。

ご意見ありがとうございます、リー

4

2 に答える 2

2

テーブル名のようなデータベース識別子に名前付きパラメータを使用することはできないと思います。値式のみ。許可されている場合は、SQLインジェクション攻撃を受けやすくなります。別の方法として、Javaでクエリを作成することもできます。

于 2009-08-14T15:11:37.190 に答える
0

どのデータベースタイプを使用していますか?一部のデータベースでは大文字と小文字が区別されます(実際、ほとんどのデータベースは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と同じである必要があります。

于 2009-08-14T13:51:28.197 に答える