我正在使用
以下声明
jdbcTemplate.query("SELECT * FROM TABLE1 ORDER BY ? ?", colName, sortOrder);
当然,这是行不通的,因为变量绑定不应该指定列名,而只是查询中表达式的参数值。
那么......人们如何解决这个问题?仅在 Java 代码中进行排序似乎是一个简单的解决方案,但由于我得到了一个用于排序的列的变量字符串,以及一个告诉我排序顺序的变量......这是一个丑陋的比较器条件数覆盖。这看起来应该是一个常见问题,有一个常见的模式来解决它......
占位符
?
只能用于参数值,但不能用于列和排序顺序方向。因此,执行此操作的标准方法如下所示: here 是使用 String#format() 或类似的东西将列名称和顺序值附加到查询中。
另一种选择是使用 Spring Data JPA,您可以将 Sort 类型的实例作为参数提供给方法,其中可以包含数据库排序所需的所有信息。
的解决方案。 一开始,我们以最简单的方式启动我们的地图。为了方便起见,我重载了 get (Obiect key) 方法,以在失败时返回
default 列(“fullName”)。这将防止 SqlException。
static Map<String,String> sortCol;
{
sortCol = new HashMap<String, String>(){
{//Enter all data for mapping
put("name","fullName");
put("rok","year");
put("rate","likes");
put("count-rate","countRate");
}
/**
*
* @param key for column name
* @return column name otherwise default "fullName"
*/
@Override
public String get(Object key) {
String col =super.get(key);
return null==col?"fullName":col;
}
};
}
这是一个简单的使用示例。
String sqlQuery= "Select \"fullName\",year,likes,count-rate, country ..."+
"from blaBla..."+
"where blaBla..."+
"order by "+sortCol.get("keySort") "\n"; // keySort can have the value name, count-rate etc ..
顺便说一句,你永远不应该在用户界面中透露列的真实名称,例如 REST 或 SOAP 等......对于攻击者来说,这是一个很大的帮助。
SELECT * FROM TABLE1
ORDER BY
CASE ?
WHEN 'col1' THEN col1
ELSE col2
END