说我有一个SQL查询,我想按不同的列排序。但是我想分开做。
例如,当用户只想按名字排序时,我要运行
Select .... from table order by firstName
当用户只想按姓氏排序时,我要运行
Select .... from table order by lastName
,依此类推。我大约有100个columns
,并且我不想创建100个sql files
并将字符串传递给queryForList
的{{1}}方法。那么有没有一种有效的方法来做到这一点?如果我对所有100个列都有一个枚举,这些枚举与数据库中真实列的名称完全匹配,那么我可以通过某种方式将此字符串作为要排序的元素吗?
我尝试通过类似
的方法来使用namedParameterJdbcTemplatejdbcTemplate
在我的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以防万一。但是,我认为解决此问题的方法将是与数据库无关的。
答案 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时,我当然会建议将有效的列名列表放入配置中,以使其更易于管理。