2009-12-09 91 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 
    } 

}