Resultset にhasNextのメソッドはありません。 resultSetに値があるかどうかを確認したい
これは正しい方法です
if (!resultSet.next() ) {
System.out.println("no data");
}
最初はResultSet
のカーソルが最初の行の前を指していますが、最初のnext()
の呼び出しでfalse
が返された場合、ResultSet
にはデータがありませんでした。
このメソッドを使用する場合は、リセットした直後にbeforeFirst()
を呼び出す必要があります。これは、最初の行を超えて配置されたためです。
ただし、以下の Seiferの回答 が、この質問に対するより優雅な解決策であることに注意してください。
最初の行の前にカーソルがある、新しく返されたResultSet
を使って作業していると仮定すると、これをチェックするもっと簡単な方法は、単にisBeforeFirst()
を呼び出すことです。これにより、データを読み取る必要がある場合にバックトラックする必要がなくなります。
ドキュメントで説明されているように 、カーソルが最初のレコードの前にない場合、またはレコードがない場合はfalseを返しますResultSet.
if (!resultSet.isBeforeFirst() ) {
System.out.println("No data");
}
あなたはいつでも次の前払いをすることができ、そしてちょうどポストループチェックをすることができます
if (!resultSet.next() ) {
System.out.println("no data");
} else {
do {
//statement(s)
} while (resultSet.next());
}
あなたは通常このようなことをするでしょう:
while ( resultSet.next() ) {
// Read the next item
resultSet.getString("columnName");
}
空のセットを報告したい場合は、読み取った項目を数える変数を追加してください。あなたがただ一つのアイテムを読む必要があるならば、あなたのコードは適切です。
これには、ResultSet.next()をdo {...} while()構文とともに使用するのが最善です。
ResultSet.next()を呼び出す「結果の確認」はカーソルを最初の行に移動するので、do {...} while()構文を使用してその行を処理しながら、ループから返される残りの行の処理を続行します。
この方法であなたはどんな結果でもチェックすることができます、同時にまた返されたどんな結果でも処理します。
if(resultSet.next()) { // Checks for any results and moves cursor to first row,
do { // Use 'do...while' to process the first row, while continuing to process remaining rows
} while (resultSet.next());
}
最も現実的な答えによると、提案は "isBeforeFirst()"を使うことです。 "forward only type"がなければ、これは最善の解決策ではありません。
" 。first() "というメソッドがあります。まったく同じ結果を得るのはやり過ぎです。あなたはあなたの "結果セット"に何かがあるかどうかをチェックし、あなたのカーソルを進めません。
ドキュメントには次のように記述されています。 "(...)結果セットに行がない場合はfalse".
if(rs.first()){
//do stuff
}
IsBeforeFirst()を呼び出して、カーソルを進めずに返された行があるかどうかをテストしてから、通常どおりに続行することもできます。 - SnakeDoc 2014年9月2日19:00
しかし、 "isBeforeFirst()"と "first()"の間には違いがあります。型が "forward only"の結果セットに対して行われた場合、まず例外を生成します。
2つのスローセクションを比較します。 http://docs.Oracle.com/javase/7/docs/api/Java/sql/ResSetSet.html#isBeforeFirst()http://docs.Oracle.com/javase/7/docs/api/Java/sql/ResultSet.html#first()
さて、基本的にこれはあなたが "forward only"型を持っている限り "isBeforeFirst"を使うべきであることを意味します。そうでなければ、 "first()"を使うのはやり過ぎです。
カーソル位置に関係なく、結果セットが空であるかどうかを完全に確認するには、次のようにします。
public static boolean isMyResultSetEmpty(ResultSet rs) throws SQLException {
return (!rs.isBeforeFirst() && rs.getRow() == 0);
}
この関数は、ResultSetが空の場合はtrueを返し、そうでない場合はfalseを返します。そのResultSetが閉じられている/初期化されていない場合はSQLExceptionをスローします。
これは実用的で読みやすい作品です。
if (res.next()) {
do {
// successfully in. do the right things.
} while (res.next());
} else {
// no results back. warn the user.
}
結果セットに行があるかどうかを確認したい場合は、これでうまくいきます。
next()
は常に次の行に移動するので、結果セットからの読み取りを計画している場合は、それを考慮する必要があります。
ResultSetの通常の使用方法(単純に読むとき)は、次のとおりです。
while (resultSet.next())
{
... read from the row here ...
}
結果セットが空かどうか調べるためにすでにnext()
を呼び出した場合は、これは明らかに正しく機能しませんので、注意してください。 「バックアップ」する方法はありますが、すべてのタイプの結果セットでサポートされているわけではありません。
if (!resultSet.isAfterLast() ) {
System.out.println("No data");
}
空の結果セットに対してもisAfterLast()
はfalseを返しますが、カーソルはとにかく最初の行の前にあるので、このメソッドはより明確に見えます。
最善の方法は、最初の行をチェックして、データを取得しようとしているときに、行をスキップするという間違いを回避できるようにすることです。のようなもの:if(!resultSet.first()){System.out.println( "no data"); }
if(resultSet.first) {
} else {
system.out.println("No raw or resultSet is empty");
}
ResultSetがrawを持たない場合、resultSet.first
はfalseを返すので。
ResultSetが空かどうか調べるために次のメソッドを作成しました。
public static boolean resultSetIsEmpty(ResultSet rs){
try {
// We point the last row
rs.last();
int rsRows=rs.getRow(); // get last row number
if (rsRows == 0) {
return true;
}
// It is necessary to back to top the pointer, so we can see all rows in our ResultSet object.
rs.beforeFirst();
return false;
}catch(SQLException ex){
return true;
}
}
以下の点を考慮することが非常に重要です。
CallableStatementオブジェクトは、ResultSetオブジェクトが最後に移動して上に戻るように設定する必要があります。
TYPE_SCROLL_SENSITIVE:ResultSetオブジェクトは最後に移動して上に戻ることができます。さらに最後の変更をキャッチすることができます。
CONCUR_READ_ONLY:ResultSetオブジェクトのデータを読むことはできますが、更新することはできません。
CallableStatement proc = dbconex.prepareCall(select, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet.next()を使用することで、resultSetに値が含まれているかどうかにかかわらず、結果を簡単に取得できます。
ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
//resultSet contain some values
else
// empty resultSet
ResultSet result = stmt.executeQuery(sqlQuery);
if (!result.next())
status = "ERROR";
else
status = "SUCCESS";
ResultSet rs = rs.executeQuery();
if(rs.next())
{
rs = rs.executeQuery();
while(rs.next())
{
//do code part
}
}
else
{
//else if no result set
}
if(rs.next()){....}
を呼び出すとResultSetの最初の行が実行され、while(rs.next()){....}
の中では次の行から結果が得られるため、queryを再実行することをお勧めします。だから私はif
の中でqueryを再実行することがより良い選択肢だと思います。
現在の行を最初のインデックスに設定しようとしています(主キーの処理)。私はお勧めします
if(rs.absolute(1)){
System.out.println("We have data");
} else {
System.out.println("No data");
}
ResultSetが移入されると、最初の行の前を指します。最初の行(rs.absolute(1)
で示される)に設定すると、1行目に正しく配置されたことを示すtrueを返します。行が存在しない場合はfalseを返します。これを次のように推定できます。
for(int i=1; rs.absolute(i); i++){
//Code
}
現在の行を位置iに設定し、行が存在しない場合は失敗します。これは単なる代替方法です。
while(rs.next()){
//Code
}
なぜrs.getRow()を使わないのですか?
int getRow()
throws SQLException
Retrieves the current row number. The first row is number 1, the second number 2, and so on.
Note:Support for the getRow method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY
Returns:
the current row number; 0 if there is no current row
Throws:
SQLException - if a database access error occurs or this method is called on a closed result set
SQLFeatureNotSupportedException - if the JDBC driver does not support this method
Since:
1.2
私のために "if(rs.getRow()!= 0)"をチェックするとうまくいくようです。
あなたはこのようなことをすることができます
boolean found = false;
while ( resultSet.next() )
{
found = true;
resultSet.getString("column_name");
}
if (!found)
System.out.println("No Data");
私は、結果セットをチェックする最も簡単な方法は、 CollectionUtils パッケージorg.Apache.commons.collections.CollectionUtilsの下にあると思います。
if(CollectionUtils.isNotEmpty(resultList)){
/**
* do some stuff
*/
}
これはnullと空の結果セット条件をチェックします。
より詳細な情報については、次の文書を参照することができます。 CollectionUtils