我已经得到了以下命名查询在休眠:

<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注射攻击。作为替代,可以构造查询。

其他提示

什么类型的数据库是你使用?一些数据库的情况下,敏感的(实际上大多数都是除了微软的)。所以表名为'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