public List<Product> getProductsByKeys(String keys){
final ArrayList<Product> products = new ArrayList<Product>();
String sql = "select * from product where name like '%"+keys+"%'";
System.out.println("sql:"+sql);
this.query(sql, new RowCallbackHandler() {

@Override
public void processRow(ResultSet rs) throws SQLException{
Product product = null;
while (rs.next()) {
product = new Product();
product.setId(rs.getString("id"));
product.setName(rs.getString("name"));
product.setPrice(rs.getString("price"));
System.out.println(product);
products.add(product);
}
}
});
return products;
}
上面的始终取不到第一个结果,所有的都是从第二个开始,Oracle的ResultSet所指向的第一个都是从真正的数据开始吗?我第一次用Oracleoraclejavasql数据next

解决方案 »

  1.   

    ResultSet的第一次next指向第一条记录,也许是在执行processRow之前已经执行了一次next。
    你只查询出一条记录试试看。
      

  2.   


    它执行query的源码是这样的
    public Object doInStatement(Statement stmt) throws SQLException {
    /* <-MISALIGNED-> *//* 441*/ResultSet rs = null;
    Object obj;
    /* <-MISALIGNED-> *//* 443*/try {
    /* <-MISALIGNED-> *//* 443*/rs = stmt.executeQuery(sql);
    /* <-MISALIGNED-> *//* 444*/ResultSet rsToUse = rs;
    /* <-MISALIGNED-> *//* 445*/if (nativeJdbcExtractor != null)
    /* <-MISALIGNED-> *//* 446*/rsToUse = nativeJdbcExtractor
    .getNativeResultSet(rs);
    /* <-MISALIGNED-> *//* 448*/obj = rse
    .extractData(rsToUse);
    }
    /* <-MISALIGNED-> *//* 451*/finally {
    /* <-MISALIGNED-> *//* 451*/JdbcUtils.closeResultSet(rs);
    }
    /* <-MISALIGNED-> *//* 448*/return obj;
    我不知道在调用这个nativeJdbcExtractor.getNativeResultSet(rs)的时候,内部的实现有没有进行next,不过如果不进行next是肯定可以查询到第一条数据的,难不成每次都要进行一次第一条查询,再进行next?
      

  3.   

    使用JDBC是没有问题的,你用别人的框架得看它的文档说明。
    你可以使用ResultSet的isBeforeFirst(),isFirst(),getRow()方法去判断是否已经执行过next了。
    如果确实是已经执行过next了,那么你可以改成:
    do{...}while(rs.next());
      

  4.   

    isBeforeFirst使用是会出错的,而isFisrt提示正确,用dowhile仍旧是同样的问题。