题
我已经得到了以下命名查询在休眠:
<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没有报价。
不隶属于 StackOverflow