У меня есть таблицы в Mysql 5 дб с именами, снабженными префиксом знак доллара $MYTABLE имени таблицы т.е. '$'
Я использую Spring 3.0 JdbcTemplate, чтобы сделать мой запрос Select, но не мог заставить его работать.
т.е.
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", .., .. ));
Информация базы данных, такая как имена/идентификаторы таблиц и столбцов, не предназначена для параметризации. MySQL использует обратный знак (`) для имен/идентификаторов таблиц и столбцов. Ваш параметризованный запрос, вероятно, будет выглядеть так:
select symbol, open, high, low, close, vol, ev from "$AAPL"
Я не знаю ни одного стандартного API для параметризации/зачеркивания таких идентификаторов. Я бы рекомендовал, если можете, просто указывать их статически. Так как это одни и те же столбцы, разделение таблицы на разделы также может быть вариантом. Наконец, если вам все же нужно, чтобы она была динамической, вам придется самостоятельно экранировать имя таблицы, я бы рекомендовал использовать его только из белого списка.
Возможно, вы захотите взглянуть на документацию mysql о том, как экранировать идентификаторы.
SQL поддерживает разграниченные идентификаторы, поэтому вы можете использовать пунктуацию, пробелы, специальные символы, международные символы или ключевые слова SQL в качестве имен таблиц или столбцов.
См. мой прошлый ответ на Используют ли разные базы данных разные кавычки для имен?
В 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. Это просто не поддерживается языком. Вы можете использовать параметр только там, где обычно используется буквальное значение, например целое число или строка в одинарных кавычках.