結果セットにJDBCで1行以上あるかどうかを確認するには?
7 に答える
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
boolean isMoreThanOneRow = rs.first() && rs.next();
あなたはこれを尋ねませんでしたが、あなたはそれを必要とするかもしれません:
boolean isEmpty = ! rs.first();
通常、FOR ループの代わりに WHILE ループを使用して結果セットを反復処理するため、行数は必要ありません。
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
while (rs.next()) {
// retrieve and print the values for the current row
int i = rs.getInt("a");
String s = rs.getString("b");
float f = rs.getFloat("c");
System.out.println("ROW = " + i + " " + s + " " + f);
}
ただし、場合によっては、結果をウィンドウで表示したい場合があり、レコード数を事前にユーザーに表示する必要がありますRow 1 to 10 of 100
。first で別のクエリを実行しSELECT COUNT(*)
てレコード数を取得できますが、2 つのクエリの実行にかかる時間の間に行が追加または削除される可能性があるため、カウントは概算であることに注意してください。
ResultSetのサンプル概要
多くのオプションがあり、より多くのコンテキストを提供しないため、残っているのは推測することだけです。私の答えは、複雑さとパフォーマンスの昇順で並べ替えられています。
- 実行
select count(1) FROM ...
して答えを得るだけです。実際にデータを選択して返す別のクエリを実行する必要があります。 - 繰り返して
rs.next()
、満足するまで数えます。それでも実際のデータが必要な場合は、同じクエリを再実行します。 - ドライバーが逆反復をサポートしている場合は、
rs.next()
数回行ってから、で巻き戻しますrs.previous()
。
これには JDBC は必要ありません。通常のイディオムは、コレクション内のすべての結果を収集し、 などのコレクション メソッドを利用することList#size()
です。
List<Item> items = itemDAO.list();
if (items.isEmpty()) {
// It is empty!
if (items.size() == 1) {
// It has only one row!
} else {
// It has more than one row!
}
メソッドは次のlist()
ようになります。
public List<Item> list() throws SQLException {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
List<Item> items = new ArrayList<Item>();
try {
connection = database.getConnection();
statement = connection.createStatement();
resultSet = statement.executeQuery(SQL_LIST);
while (resultSet.next()) {
Item item = new Item();
item.setId(resultSet.getLong("id"));
item.setName(resultSet.getString("name"));
// ...
items.add(item);
}
} finally {
if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
}
return items;
}
私の簡単な提案: 最初の結果行を取得してから、次の行を取得してみてください。試行が成功した場合は、複数の行があります。
複数の行があり、そのデータを処理したい場合は、最初の行からのものをキャッシュするか、スクロール可能な結果セットを使用して、結果を確認する前に先頭に戻ることができるようにする必要があります。
SELECT COUNT(*)
クエリの残りの部分でa を実行して、この情報を SQL に直接問い合わせることもできます。クエリの残りの部分が返す行数に応じて、結果は 0、1、またはそれ以上になります。これは非常に簡単に実装できますが、次に実際のクエリを読み取って処理する必要があると仮定すると、DB への 2 つのクエリが必要になります。
ResultSetMetaData
クラスを使用して行数を取得します。
あなたのコードから、次のように作成できますResultSetMetaData
:
ResultSetMetaData rsmd = resultSet.getMetaData(); //get ResultSetMetaData
rsmd.getColumnCount(); // get row count from resultsetmetadata