2009-08-14 50 views
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的更好的選擇。

感謝您的任何輸入, 李

回答

2

我不認爲你可以使用數據庫標識符如表名稱命名參數。只有值表達式。如果允許,它會讓你容易受到SQL注入攻擊。作爲替代方法,您可以使用Java構建查詢。

0

您正在使用什麼數據庫類型?有些數據庫區分大小寫(實際上大多數都是微軟公司除外)。所以名爲'wibble'的表與'WiBbLe'不同,並且與'WIBBLE'不同。

當您創建一個名爲wibble且沒有引號的表時,大多數數據庫(例如Oracle)都將此創建爲所有大寫'WIBBLE'中指定的表。當您的查詢使用它,你在這裏做的:

SELECT * FROM wibble 

該數據庫將其解釋爲「維布勒」並沒有什麼問題。

持久性提供者似乎總是把它放在引號中。要使引用的名稱與創建時相同,您應該將其大寫。所以試試這個:

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

這應該創建'WIBBLE'的語句,它應該與沒有引號的wibble相同。

+0

數據庫是MySQL的一個,它被設置爲不區分大小寫。但我認爲這不是個案。我現在只是在嘗試創建聲明,因此無論我使用哪種情況都應該沒問題。它似乎只是我需要刪除的那些引號。 – 2009-08-14 14:25:25