2015-11-17 23 views
1

У меня есть запрос sql.JdbcTemplate - заменить знак вопроса

String sql = "SELECT ? FROM Users WHERE Lastname=?"; 

Я использую метод queryForList от JdbcTemplate

Object [] myparams = {"name", "Doe"}; 
int [] mytypes = {Types.VARCHAR, Types.VARCHAR}; 
List<Map<String,Object>> listOfMaps = jdbc.queryForList(sql, myparams, mytypes); 

Выход неверен, так как существует проблема с первым знаком вопроса. Я думал, что вопросительный знак будет заменен параметром из массива myparams, но это не сработало.

Возможно ли сделать то, что я хочу достичь, но не вручную добавив параметр в строку?

+2

Вопросительный знак, который вы можете использовать только для параметра в инструкции where. Не для столбцов в select statement – Jens

ответ

1

Вы можете использовать знак вопроса только для параметров в инструкции where.

+0

Хорошо, но есть ли другой способ сделать то, что я хочу? Что вставляет строку в запрос безопасным способом? – Someone

+0

Нет, почему вы не можете использовать «Выбрать *»? –

+0

Поскольку запрос может возвращать огромный список объектов, и могут потребоваться только некоторые столбцы. Я не хочу анализировать список после запроса. – Someone

1

Ни JDBC, ни Spring не предлагают способ создания SQL-запросов из меньших частей.

Вы можете попробовать специальный узор, чтобы отметить детали, которые вы хотите заменить. Вообще-то это не является хорошей практикой (из-за возможных атак SQL Injection)

String sql = "SELECT ${columns} FROM Users WHERE Lastname=?" 
    .replace("${columns}", "name"); 

Для этого, чтобы быть в безопасности, вы должны убедиться, что "name" не может быть введен злоумышленником. Попробуйте использовать строковые константы (final static String) или перечисления. Никогда не принимайте значения извне (веб-браузер, переменные среды), не проверяя их.

Смежные вопросы