2009-12-09 89 views
1

我有一些問題,我敢肯定這是愚蠢的。PreparedStatement沒有返回結果集ResultSet

所以我有這樣

SELECT name, id, xyz FROM table ORDER BY ? 

後來在路上設置一個查詢?做一個

ps.setString(1, "xyz"); 

我在控制檯輸出查詢和xyz的值。當我循環從PreparedStatement返回的ResultSet時,值的順序不正確。它們在返回的順序中,就好像我已經關閉了ORDER BY子句一樣。當我將查詢和值複製/粘貼到TOAD時,它會運行並正確返回。

爲什麼ResultSet沒有以正確的順序回來的任何想法?

回答

13

該數據庫將看到由恆定表達(在此情況下,字符串「XYZ」)作爲查詢

SELECT name, id, xyz FROM table ORDER BY 'xyz' 

也就是說,順序。任何訂單都能滿足這一點。

+0

+1不錯,湯姆。魔鬼的細節 – wowest

+0

jeebus,你以爲我會想到這一點。但是那清除了它。謝謝! – user16208

+0

您只能在預準備語句中指定常量。 –

5

?是參數,你不能用它來插入列名。生成的報表看起來像

SELECT name, id, xyz FROM table ORDER BY 'xyz' 

,使您的條目由字符串「XYZ」來分類,而不是列XYZ的內容。

+0

現在我明白了,但我花了很多時間試圖找出爲什麼我的結果沒有排序。這很好地總結了它。 – styfle

3

爲什麼不運行:

ps.setInteger(1, 3); 

問候。

編輯:AFAIK Oracle 10g支持它。

0

PreparedStatement佔位符不打算用於表名或列名。它們僅用於實際列值。

但是,您可以使用String#format(),這也是我經常這樣做的方式。例如:

private static final String SQL_SELECT_ORDER = "SELECT name, id, xyz FROM table ORDER BY %s"; 

... 

public List<Data> list(boolean ascending) { 
    String order = ascending ? "ASC" : "DESC"; 
    String sql = String.format(SQL_SELECT_ORDER, order); 
    ... 

又如:

private static final String SQL_SELECT_IN = "SELECT name, id, xyz FROM table WHERE id IN (%s)"; 

... 

public List<Data> list(Set<Long> ids) { 
    String placeHolders = generatePlaceHolders(ids.size()); // Should return "?,?,?..." 
    String sql = String.format(SQL_SELECT_IN, placeHolders); 
    ... 
    DAOUtil.setValues(preparedStatement, ids.toArray()); 
    ... 
+1

不應該是'「SELECT name,id,xyz FROM table ORDER BY%s%s」'然後是'String。格式(SQL_SELECT_ORDER,orderby,order);' – styfle

0

數據庫會看到這樣

SELECT name, id, xyz FROM table ORDER BY 'xyz' 

我想你應該增加更多的變數像order_field和order_direction

查詢我假設你有一個像下面這樣的方法,我給你一個例子來解決它

pulbic List<Object> getAllTableWithOrder(String order_field, String order_direction) { 
    String sql = "select * from table order by ? ?"; 
    //add connection here 

    PreparedStatement ps = (PreparedStatement) conn.prepareStatement(sql); 
    ps.setString(1,order_field); 
    ps.setString(2,order_direction); 

    logger.info(String.valueOf(ps)); //returns something like: [email protected]: select * from table order by 'id' 'desc' 

    String sqlb = String.valueOf(ps); 
    String sqlc = sqlb.replace("'"+order_field+"'", order_field); 
    String sqld = sqlc.replace("'"+order_direction+"'", order_direction); 

    String[] normQuery = sqld.split(":"); 

    ResultSet result = conn.createStatement().executeQuery(normQuery[1]); 

    while(result.next()) { 
     //iteration 
    } 

}