2015-11-17 36 views
1

我有一個SQL查詢。JdbcTemplate - 替換問號

String sql = "SELECT ? FROM Users WHERE Lastname=?"; 

我使用的方法的queryForList從JdbcTemplate的

Object [] myparams = {"name", "Doe"}; 
int [] mytypes = {Types.VARCHAR, Types.VARCHAR}; 
List<Map<String,Object>> listOfMaps = jdbc.queryForList(sql, myparams, mytypes); 

輸出不正確,因爲不存在與第一問號的問題。我認爲這個問號會被myparams數組中的參數取代,但它並沒有以這種方式工作。

是否有可能做我想達到的目的,但不是通過手動添加參數到字符串?

+2

問號只能用於where語句中的參數。不適用於選擇語句中的列 – Jens

回答

1

只能將問號用於where語句中的參數。

+0

好的,但有沒有其他方法可以做我想做的事?哪種插入字符串的方式是安全的? – Someone

+0

不,你爲什麼不能使用「Select *」? –

+0

因爲查詢可以返回一個巨大的對象列表,並且只需要一些列。我不想在查詢後解析列表。 – Someone

1

JDBC和Spring都沒有提供從小塊構建SQL查詢的方法。

您可以嘗試使用特殊圖案來標記要替換的部件。一般來說這是不好的做法(由於可能的SQL注入攻擊)

String sql = "SELECT ${columns} FROM Users WHERE Lastname=?" 
    .replace("${columns}", "name"); 

對於這個是安全的,你必須確保"name"不能被攻擊者注入。嘗試使用字符串常量(final static String)或枚舉。切勿接受來自外部的值(網絡瀏覽器,環境變量)而不驗證它們。