web-dev-qa-db-ja.com

Java ResultSetに結果があるかどうかをチェックする方法

Resultset にhasNextのメソッドはありません。 resultSetに値があるかどうかを確認したい

これは正しい方法です

if (!resultSet.next() ) {
    System.out.println("no data");
} 
289
kal

最初はResultSetのカーソルが最初の行の前を指していますが、最初のnext()の呼び出しでfalseが返された場合、ResultSetにはデータがありませんでした。

このメソッドを使用する場合は、リセットした直後にbeforeFirst()を呼び出す必要があります。これは、最初の行を超えて配置されたためです。

ただし、以下の Seiferの回答 が、この質問に対するより優雅な解決策であることに注意してください。

220
ninesided

最初の行の前にカーソルがある、新しく返されたResultSetを使って作業していると仮定すると、これをチェックするもっと簡単な方法は、単にisBeforeFirst()を呼び出すことです。これにより、データを読み取る必要がある場合にバックトラックする必要がなくなります。

ドキュメントで説明されているように 、カーソルが最初のレコードの前にない場合、またはレコードがない場合はfalseを返しますResultSet.

if (!resultSet.isBeforeFirst() ) {    
    System.out.println("No data"); 
} 

496
Seifer

あなたはいつでも次の前払いをすることができ、そしてちょうどポストループチェックをすることができます

if (!resultSet.next() ) {
    System.out.println("no data");
} else {

    do {
     //statement(s)
    } while (resultSet.next());
}
48
Maslow

あなたは通常このようなことをするでしょう:

while ( resultSet.next() ) { 
   // Read the next item
   resultSet.getString("columnName");
}

空のセットを報告したい場合は、読み取った項目を数える変数を追加してください。あなたがただ一つのアイテムを読む必要があるならば、あなたのコードは適切です。

19
kgiannakakis

これには、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());
}
8
Dermot Doherty

最も現実的な答えによると、提案は "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()"を使うのはやり過ぎです。

8
OddDev

カーソル位置に関係なく、結果セットが空であるかどうかを完全に確認するには、次のようにします。

public static boolean isMyResultSetEmpty(ResultSet rs) throws SQLException {
    return (!rs.isBeforeFirst() && rs.getRow() == 0);
}

この関数は、ResultSetが空の場合はtrueを返し、そうでない場合はfalseを返します。そのResultSetが閉じられている/初期化されていない場合はSQLExceptionをスローします。

8
Felype

これは実用的で読みやすい作品です。

        if (res.next()) {
            do {

                // successfully in. do the right things.

            } while (res.next());
        } else {
           // no results back. warn the user.
        }
5
JSBach

結果セットに行があるかどうかを確認したい場合は、これでうまくいきます。

next()は常に次の行に移動するので、結果セットからの読み取りを計画している場合は、それを考慮する必要があります。

ResultSetの通常の使用方法(単純に読むとき)は、次のとおりです。

while (resultSet.next())
{
   ... read from the row here ...
}

結果セットが空かどうか調べるためにすでにnext()を呼び出した場合は、これは明らかに正しく機能しませんので、注意してください。 「バックアップ」する方法はありますが、すべてのタイプの結果セットでサポートされているわけではありません。

5
Nuoji
if (!resultSet.isAfterLast() ) {    
System.out.println("No data"); 
} 

空の結果セットに対してもisAfterLast()はfalseを返しますが、カーソルはとにかく最初の行の前にあるので、このメソッドはより明確に見えます。

2
Nick Warke

最善の方法は、最初の行をチェックして、データを取得しようとしているときに、行をスキップするという間違いを回避できるようにすることです。のようなもの:if(!resultSet.first()){System.out.println( "no data"); }

1
Anthony Oyovwe
if(resultSet.first) {

} else { 
    system.out.println("No raw or resultSet is empty");
}

ResultSetがrawを持たない場合、resultSet.firstはfalseを返すので。

1
user868927

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);
1
Cristian

ResultSet.next()を使用することで、resultSetに値が含まれているかどうかにかかわらず、結果を簡単に取得できます。

ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
 //resultSet contain some values
else
 // empty resultSet
1
Ram72119
ResultSet result = stmt.executeQuery(sqlQuery);
if (!result.next())
    status = "ERROR";
else
    status = "SUCCESS";
1
Deepu Surendran
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を再実行することがより良い選択肢だと思います。

0
Arpit Trivedi

現在の行を最初のインデックスに設定しようとしています(主キーの処理)。私はお勧めします

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
}
0
Andrew

なぜ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)"をチェックするとうまくいくようです。

0
stiebrs

あなたはこのようなことをすることができます

boolean found = false;

while ( resultSet.next() )
{
    found = true;
    resultSet.getString("column_name");
}

if (!found)
    System.out.println("No Data");
0

私は、結果セットをチェックする最も簡単な方法は、 CollectionUtils パッケージorg.Apache.commons.collections.CollectionUtilsの下にあると思います。

if(CollectionUtils.isNotEmpty(resultList)){
  /**
  * do some stuff
  */
}

これはnullと空の結果セット条件をチェックします。

より詳細な情報については、次の文書を参照することができます。 CollectionUtils

0