2014-09-14 3 views
1

Я использую JdbcTemplate весны, и у меня есть следующий запрос:как запросить с GroupBy в JdbcTemplate

SELECT ?, count(*) as " + counter + " FROM data GROUP BY ? 

Когда я использую

List<Map<String, Object>> values = jdbcTemplate.queryForList(sql,columnName, columnName); 

я получаю неверные результаты запроса - Я получаю одну строку с счетчиком 11, которая является счетчиком ВСЕХ строк в таблице данных. Так ясно, что groupBy работает неправильно. я отлажен код и увидела, что выполняется запрос на самом деле

SELECT 'COLUMN_3', count(*) as COUNTER FROM DATA GROUP BY 'COLUMN_3' 

Так что я подозреваю, что дополнительный апостроф то, что вызывает ошибку.

Как я могу это решить? (Без использования простого запроса String - я хочу использовать PreparedStatement, поэтому у меня не будет проблем с SQL Injection).

+2

Вы не можете использовать заполнитель для имен столбцов или таблиц. Эти данные необходимы базе данных для подготовки плана выполнения запроса. подготовленные заполнители выписок для значений. Если вы позволите пользователю выбрать то, что он хочет выбрать (что крайне редко), тогда отклоните выбор, если он не является частью белого списка имен столбцов. –

+0

Это по-прежнему странно для меня - потому что запрос «почти» преуспевает, все, что осталось, это те апострофы ... Но, поскольку вы не единственный, кто сказал это, я думаю, у меня нет выбора. Благодарю. – yishaiz

+0

Это не работает. Он выбирает постоянную строку «COLUMN_3» вместо выбора значения column_3. Потому что вы не можете передавать имена столбцов в качестве подготовленных параметров оператора. Только значения. –

ответ

2

Вы используете sql? заполнители только в предложении WHERE в Sql PreparedStatements, таком как WHERE bossesname =?

В вашем случае заменить s с ява переменных, как в:

String columnName = "COLUMN_3"; 
String counter = "COUNTER"; 
SELECT " + columnName + ", count(*) as " + counter + " FROM data GROUP BY " + columnName 

Затем использовать упрощенную форму queryForList:

List<Map<String, Object>> values = jdbcTemplate.queryForList(sql); 
+0

Привет, как я сказал в вопросе, - что вызывает проблемы с SQL-инъекциями. – yishaiz

+1

Возможно, я не понял, что вы пытаетесь сделать, я отредактировал свой ответ. Также я не думаю, что это простое заявление находится под угрозой SQL-инъекции, а только переменные в предложениях WHERE. – mwarren

+0

@mwarren Будет ли jdbcTemplate.queryForList (sql); Работа? Поскольку queryForList (..) специально ищет выбранное количество столбцов как 1 –

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