Edited at

Resultsetのnext()は、"ResultSetの次があるかどうかを判定するメソッド"ではない。

More than 1 year has passed since last update.


rs.next()について勘違いをしていたことが判明。

誰か同じような勘違いをしていたら・・・と思い、投稿します。


rs.next()の解釈について

rs.next()は"ResultSetの次があるかどうかだけを判定するメソッド"だと思っていたのですが、

さらに、"現在の位置から次の1行へ進んでカーソルを当てる"機能もあるようです。

 (詳細は、Oracleのページを確認ください。)


間違い.java

ResultSet rs = stmt.executeQuery(sql);

//結果がなければnullを返却する    
if(rs.next()){ //←ここで結果の1行目にカーソルが当たっている
return null;
}

//2.リストを生成する   
while (rs.next()) { // ←ここで結果の2行目にカーソルが当たっている
list.add(rs.getString("name")); // ←ここで結果び2行目のnameが取れている
}


上記ののようにコーディングしていました。

間違い.javaで生成したリストは、コマンドでSQL叩くより1行少ない!と小一時間悩んでいました・・・。

それもそのはずです。

whileで回す前に、結果の1行目にカーソルが当たってしまっているので、

whileで回そうとした時には、結果の2行目にカーソルが当たってしまい、

結果の1行目はリストに追加されていなかったのです。


正しいケース

参考までに、下記のようにすれば、結果が0件の場合の処理もかけるようです。


正解.java

ResultSet rs = stmt.executeQuery(sql);

//リストにデータを追加する
while (rs.next()) {
list.add(rs.getString("フィールド名"));
}

//リストがからの場合、nullを返却する
if(list.isEmpty()){
return null;
}



追記

一部ソースコード修正しました。saka1029さん、Kilisameさんご指摘ありがとうございます!