如何使用Spring JDBCTemplate按多列排序?

时间:2018-12-06 18:50:05

标签: sql-server spring sorting sql-order-by jdbctemplate

说我有一个SQL查询,我想按不同的列排序。但是我想分开做。

例如,当用户只想按名字排序时,我要运行

Select .... from table order by firstName

当用户只想按姓氏排序时,我要运行

Select .... from table order by lastName

,依此类推。我大约有100个columns,并且我不想创建100个sql files并将字符串传递给queryForList的{​​{1}}方法。那么有没有一种有效的方法来做到这一点?如果我对所有100个列都有一个枚举,这些枚举与数据库中真实列的名称完全匹配,那么我可以通过某种方式将此字符串作为要排序的元素吗?

我尝试通过类似

的方法来使用namedParameterJdbcTemplate
jdbcTemplate

在我的Java代码中,我做到了

Select .... from table order by :query

但是它给了我一个绑定错误,因为我不是绑定值,而是绑定真正的sql语法。

我想到的另一种方法是实际使用简单的Java字符串操作(如replace方法)将// njdbc stands for namedParameterJdbcTemplate MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("query","firstName"); njdbc.queryForList(sql, params); 替换为我的列名(例如,firstName)。但是,这不是正确的方法,因为这容易导致sql注入。

注意:为简洁起见,删除了许多sql语法。我也使用sql-server以防万一。但是,我认为解决此问题的方法将是与数据库无关的。

1 个答案:

答案 0 :(得分:1)

您正确地指出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时,我当然会建议将有效的列名列表放入配置中,以使其更易于管理。