【问题标题】:How to sort by multiple columns using spring jdbctemplate?如何使用spring jdbctemplate按多列排序?
【发布时间】:2018-12-06 18:50:05
【问题描述】:

假设我有一个 sql 查询,我想按不同的列进行排序。但是我想单独做。

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

Select .... from table order by firstName

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

Select .... from table order by lastName

等等。我有大约 100 个columns,我不想创建 100 个sql files 并将字符串传递给jdbcTemplatequeryForList 方法。那么有没有一种有效的方法呢?如果我有一个所有 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 字符串操作(如替换方法)将 :query 替换为我的列名(例如 firstName)。但是,这不是正确的方法,因为这很容易发生 sql 注入。

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

【问题讨论】:

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


【解决方案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,我当然建议您将有效列名列表放入配置中,以使其更易于管理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    相关资源
    最近更新 更多