如何使用 spring jdbctemplate 按多列排序?
How to sort by multiple columns using spring jdbctemplate?
假设我有一个 sql 查询,我想在其中按不同的列进行排序。但是我想单独做。
例如,当用户只想按名字排序时,我想 运行
Select .... from table order by firstName
当用户只想按姓氏排序时,我想 运行
Select .... from table order by lastName
等等。我有大约 100 columns
,我不想创建 100 sql files
并将字符串传递给 jdbcTemplate
的 queryForList
方法。那么有没有一种有效的方法呢?如果我有一个与数据库中真实列的名称完全匹配的所有 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 注入是一个潜在问题是正确的,但您可以通过检查输入来防止它。
您可能会使用这样的东西:
@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,我当然会建议将有效列名列表放入配置中,以便于管理它们。
假设我有一个 sql 查询,我想在其中按不同的列进行排序。但是我想单独做。
例如,当用户只想按名字排序时,我想 运行
Select .... from table order by firstName
当用户只想按姓氏排序时,我想 运行
Select .... from table order by lastName
等等。我有大约 100 columns
,我不想创建 100 sql files
并将字符串传递给 jdbcTemplate
的 queryForList
方法。那么有没有一种有效的方法呢?如果我有一个与数据库中真实列的名称完全匹配的所有 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 注入是一个潜在问题是正确的,但您可以通过检查输入来防止它。
您可能会使用这样的东西:
@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,我当然会建议将有效列名列表放入配置中,以便于管理它们。