Resultset не имеет метода для hasNext. Я хочу проверить, имеет ли значение resultSet значение
это правильный путь
if (!resultSet.next() ) {
System.out.println("no data");
}
Resultset не имеет метода для hasNext. Я хочу проверить, имеет ли значение resultSet значение
это правильный путь
if (!resultSet.next() ) {
System.out.println("no data");
}
Правильно, сначала курсор ResultSet
указывает перед первой строкой, если первый вызов next()
возвращает false
, тогда в ResultSet
не было данных.
Если вы используете этот метод, вам может потребоваться позвонить beforeFirst()
сразу после reset, так как он уже проложил себе первую строку.
Следует отметить, что Ответ 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() для этого.
Вызов ResetSet.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()". Это не лучшее решение, если у вас нет "только для прямого типа" .
Есть метод, называемый . first() ". Это меньше перепроизводства, чтобы получить тот же результат. Вы проверяете, есть ли что-то в вашем" наборе результатов" и не продвигайте курсор.
В документации указано: "(...) false, если в результирующем наборе нет строк.
if(rs.first()){
//do stuff
}
Вы также можете просто вызвать isBeforeFirst(), чтобы проверить, есть ли какие-либо строки, возвращенные без продвижения курсора, а затем продолжить нормально. - SnakeDoc Sep 2 '14 в 19:00
Однако существует разница между "isBeforeFirst()" и "first()". Сначала генерирует исключение, если оно сделано на наборе результатов, из типа "только вперед".
Сравните две секции броска: http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#isBeforeFirst() http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#first()
Хорошо, в основном это означает, что вы должны использовать "isBeforeFirst", если у вас есть тип "только вперед". В противном случае это меньше переполняет использование "first()".
Это будет работать, если вы хотите увидеть, есть ли какие-либо строки в результирующем наборе yes.
Обратите внимание, что next()
всегда перемещается в следующую строку, поэтому, если вы планируете делать какие-либо чтения из набора результатов, вам нужно учитывать это.
Обычное использование с ResultSet (при простом чтении):
while (resultSet.next())
{
... read from the row here ...
}
Что явно не сработает, если вы уже вызвали next()
один раз, чтобы проверить, был ли набор результатов пустым, поэтому следите за этим. Хотя существуют методы для "резервного копирования", они не поддерживаются для всех типов наборов результатов.
Чтобы быть полностью уверенным, что набор результатов пуст или не зависит от положения курсора, я бы сделал следующее:
public static boolean isMyResultSetEmpty(ResultSet rs) throws SQLException {
return (!rs.isBeforeFirst() && rs.getRow() == 0);
}
Эта функция вернет true, если ResultSet пуст, false, если нет, или выбросите SQLException, если этот ResultSet закрыт/неинициализирован.
if (!resultSet.isAfterLast() ) {
System.out.println("No data");
}
isAfterLast()
также возвращает false для пустого набора результатов, но так как курсор находится перед первой строкой, этот метод кажется более понятным.
Это практичный и легкий читаемый фрагмент, который я считаю.
if (res.next()) {
do {
// successfully in. do the right things.
} while (res.next());
} else {
// no results back. warn the user.
}
if(reset.first) {
} else {
system.out.println("No raw or reset is empty");
}
Потому что если ResultSet не имеет raw, тогда reset.first
возвращает false.
ResultSet result = stmt.executeQuery(sqlQuery);
if (!result.next())
status = "ERROR";
else
status = "SUCCESS";
Самое лучшее, что можно сделать, это проверить первую строку, чтобы при намеревании получить данные можно избежать ошибки пропуска строки. Что-то вроде: if (! ResultSet.first()) {System.out.println( "no data" ); }
Используя resultSet.next(), вы можете легко получить результат, будь то resultSet, содержащий любое значение или не
ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
//resultSet contain some values
else
// empty resultSet
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()){....}
мы получим результат из следующей строки. Поэтому я считаю, что повторное выполнение запроса внутри if
является лучшим вариантом.
Я создал следующий метод, чтобы проверить, является ли 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);
вы можете сделать что-то вроде этого
boolean found = false;
while ( resultSet.next() )
{
found = true;
resultSet.getString("column_name");
}
if (!found)
System.out.println("No Data");
Я пытаюсь установить текущую строку в первый индекс (имеющий дело с первичными ключами). Я бы предложил
if(rs.absolute(1)){
System.out.println("We have data");
} else {
System.out.println("No data");
}
Когда ResultSet заполняется, он указывает перед первой строкой. При установке его в первую строку (обозначенную rs.absolute(1)
) он вернет истину, обозначив, что она была успешно помещена в строку 1, или false, если строка не существует. Мы можем экстраполировать это на
for(int i=1; rs.absolute(i); i++){
//Code
}
который устанавливает текущую строку в положение я и сбой, если строка не существует. Это просто альтернативный метод
while(rs.next()){
//Code
}
Я думаю, что самый простой способ проверить набор результатов - через CollectionUtils в пакете org.apache.commons.collections.CollectionUtils
if(CollectionUtils.isNotEmpty(resultList)){
/**
* do some stuff
*/
}
Это будет проверять как пустое, так и пустое условие набора результатов.
Для получения более подробной информации вы можете обратиться к следующему документу. CollectionUtils
Почему бы не использовать 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)", похоже, работает нормально.
Изначально объект результирующего набора (rs) указывает на BFR (перед первой записью). Когда мы используем rs.next(), курсор указывает на первую запись, а rs имеет значение "true". Используя цикл while, вы можете распечатать все записи таблицы. После того, как все записи будут восстановлены, курсор переместится на ALR (после последней записи), и будет установлено значение null. Давайте рассмотрим, что в таблице есть 2 записи.
if(rs.next()==false){
// there are no records found
}
while (rs.next()==true){
// print all the records of the table
}
Вкратце, мы можем также записать условие как while (rs.next()).