我在Mysql 5 db中有表格,其名称前缀为美元符号'$' 即tablename $ MYTABLE
我使用Spring 3.0 JdbcTemplate来执行我的选择查询但无法使其工作。
即
String tablename = "$AAPL";
private static final String STOCK_SELECT =
"select symbol, open, high, low, close, vol, ev from ?";
jdbcTemplate.query(STOCK_SELECT,
new Object[] { tablename },
new RowMapper() { .... } );
这将始终抛出InvalidSqlException,大概是因为$符号。 如果我只是在没有参数的情况下进行普通查询,即
private static final String STOCK_SELECT =
"select symbol, open, high, low, close, vol, ev from $AAPL";
然后一切正常。
如何使用jdbcTemplate转义$符号?
- 编辑,我最终做了什么 -
我没有将表名“$ AAPL”传递给jdbcTemplate,而只是手动创建SQL字符串,即
jdbcTemplate.query( getStockSelect("$AAPL", .., .. ));
答案 0 :(得分:2)
SQL支持分隔标识符,因此您可以使用标点符号,空格,特殊符号,国际字符或SQL关键字作为表名或列名。
查看我过去对Do different databases use different name quote?
的回答在MySQL中,使用反引号:
private static final String STOCK_SELECT =
"select symbol, open, high, low, close, vol, ev from `$AAPL`";
或者将SQL_MODE设置为ANSI模式并使用双引号:
private static final String STOCK_SELECT =
"select symbol, open, high, low, close, vol, ev from \"$AAPL\"";
您不能在SQL中使用?
占位符作为表名。这只是语言不支持的。您可以使用参数 only ,您通常可以使用文字值,如整数或单引号字符串。
答案 1 :(得分:0)
表格和列名称/标识符等数据库信息不应参数化。 MySQL对表和列名称/标识符使用反引号(`)。您的参数化查询可能会以:
的形式出现 select symbol, open, high, low, close, vol, ev from "$AAPL"
我不知道任何用于参数化/转义标识符的标准API。我建议,如果可以的话,只是静静地把它放在那里。由于它们是相同的列,因此对表进行分区也可能是一种选择。最后,如果你仍然需要它是动态的,你必须自己逃避表名,我建议只从白名单中取出它。