代码之家  ›  专栏  ›  技术社区  ›  user16208

PreparedStatement未返回有序结果集

  •  1
  • user16208  · 技术社区  · 15 年前

    我有一些问题,我相信这是愚蠢的。

    所以我有一个类似的问题

    SELECT name, id, xyz FROM table ORDER BY ?
    

    ps.setString(1, "xyz");
    

    我正在控制台中输出查询和xyz的值。当我循环从PreparedStatement返回的ResultSet时,值的顺序不正确。它们在退回的订单中,就好像我没有按条款订购一样。当我将查询和值复制/粘贴到TOAD中时,它会运行并正确返回。

    5 回复  |  直到 15 年前
        1
  •  13
  •   Tom Hawtin - tackline    15 年前

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

    也就是说,按常量表达式(本例中为字符串“xyz”)排序。任何订单都能满足这一要求。

        2
  •  5
  •   Thomas Lötzer    15 年前

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

    因此,条目是按字符串“xyz”排序的,而不是按列xyz的内容排序的。

        3
  •  3
  •   ATorras    15 年前

    为什么不运行:

    ps.setInteger(1, 3);
    

    当做

    编辑:AFAIK Oracle 10g支持它。

        4
  •  1
  •   BalusC    15 年前

    但是,您可以使用 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());
        ...
    
        5
  •  0
  •   user1034754    11 年前

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

    我假设你有一个像下面这样的方法,我给你一个例子来解决它

    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: com.mysql.jdbc.JDBC4PreparedStatement@a0ff86: 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
        }
    
    }
    
    推荐文章