javajdbc

resultset isn't going into while loop and set the value


Observing a strange behavior of this piece of code,because resultset is not giving the null value(doing SOP it's clear)but not going into while loop(that is quite strange!)and it's simple dao class,it's not able to set the value in user object:

public class DAO{

 public List<User> searchAllUsers(int offset ,int noOfRecords, String column, String value){
    String query="select SQL_CALC_FOUND_ROWS * from info where '"+column+"' like '%"+value+"%' order by serialNo asc limit " + offset + "  ,  " + noOfRecords;
    //  String query="select * from info where '"+select+"' like '%"+search+"%' order by serialNo asc";
    System.out.println("1");
    List<User> list = new ArrayList<User>();
    User user=null;

    try {
        System.out.println("b4 Connection");
        connection = getConnection();
        System.out.println("After Connection");
        stmt = connection.createStatement();
        System.out.println("Create statement");
        ResultSet rs=stmt.executeQuery(query);
        if(rs!=null)
        System.out.println("1> Hi rs:"+rs);
        while(rs!= null && rs.next()){
            System.out.println("hi...!!");
            user=new User();
            user.setSerial(rs.getInt(1));
            System.out.println("Serial : "+rs.getInt(1));
            user.setName(rs.getString(2));
            user.setEmail(rs.getString(3));
            user.setImei(rs.getString(4));
            System.out.println("I'm here !");
            user.setModel(rs.getString(5));
            user.setManufacturer(rs.getString(6));
            user.setOsversion(rs.getString(7));
            user.setHdyk(rs.getString(8));
            user.setDate(rs.getString(9));
            user.setAppname(rs.getString(10));
            list.add(user);
            System.out.println("Last..");
            }
        rs.close();
        rs = stmt.executeQuery("SELECT FOUND_ROWS()");
        System.out.println("2> :" +rs);
        if(rs.next()){
            this.noOfRecords = rs.getInt(1); 
        System.out.println("3> :" +this.noOfRecords);
        }
        rs.close();
    } catch (SQLException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
      finally
    {
        try {
            if(stmt != null)
                stmt.close();
            if(connection != null)
                connection.close();
            } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    return list;

}

public int getNoOfRecords() {
    return noOfRecords;
}
}

And it corresponding output is :

1
b4 Connection
After Connection
Create statement
1> Hi rs:com.mysql.jdbc.JDBC4ResultSet@35e6e3
2> :com.mysql.jdbc.JDBC4ResultSet@c9630a
3> :0

Even I'm also using the same code like it for select All user's and that point of time I'm getting proper o/p.

Spending so many hours for it,but unable to resolve it-where I'm going wrong....so your review & comment will be always welcome.


Solution

  • That's because your query didn't fetch you any row. And hence rs.next() will return false, hence the execution will not go into the while loop:

    while(rs!= null && rs.next())
    

    And you don't have to check for rs != null. It won't be null. The stmt.executeQuery always returns a ResultSet. Just have rs.next() in your while:

    while(rs.next())
    

    And yes, you should use PreparedStatement for executing your query rather than Statement. Here's a tutorial which will help you get started.