Как отсортировать по нескольким столбцам, используя пружину jdbctemplate? - PullRequest
0 голосов
/ 06 декабря 2018

Скажем, у меня есть SQL-запрос, где я хочу сортировать по разным столбцам.Однако я хочу сделать это отдельно.

Например, когда пользователь хочет отсортировать только по firstName, я хочу запустить

Select .... from table order by firstName

, когда пользователь хочет отсортировать только по lastName, я хочу запустить

Select .... from table order by lastName

и так далее.У меня есть около 100 columns, и я не хочу создавать 100 sql files и передавать строки в метод queryForList из jdbcTemplate.Так есть ли эффективный способ сделать это?Если у меня есть перечисление для всех 100 столбцов, которые точно соответствуют имени реального столбца в базе данных, могу ли я каким-то образом передать эту строку как элемент, по которому я хочу упорядочить?

Я попытался использовать namedParameterJdbcTemplate, выполнивчто-то вроде

Select .... from table order by :query

, и в своем Java-коде я сделал

// njdbc stands for namedParameterJdbcTemplate
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("query","firstName");
njdbc.queryForList(sql, params);

Но это дает мне ошибку привязки, так как я не привязываюсь к значению, а к реальному синтаксису sql.

Еще один способ, который я задумал сделать, - это на самом деле использовать простые операции Java String (например, метод replace), чтобы заменить :query на имя моего столбца (например, firstName).Однако это неправильный способ сделать это, так как это склонно к SQL-инъекциям.

Примечание. Для краткости удален большой синтаксис sql.Я также использую sql-сервер на случай, если это поможет.Однако я думаю, что решение для этого было бы независимым от базы данных.

1 Ответ

0 голосов
/ 08 декабря 2018

Вы правильно заметили, что SQL-инъекция является потенциальной проблемой, но вы можете избежать этого, проверив ввод.

Вы можете использовать что-то вроде этого:

@Value("${some-property}")
private List<String> validSortColumns;

public void foo(String sortColumn) {
    String newSql = sql;
    if (validSortColumns.contains(sortColumn))
       newSql = sql + " ORDER BY " + sortColumn;

    return njdbc.queryForList(newSql);
}

Поскольку вы уже используете Spring, я бы определенно рекомендовал поместить список допустимых имен столбцов в конфигурацию, чтобы упростить управление ими.

...