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()
сразу же после сброса, поскольку теперь он находится за первой строкой.
Следует отметить, однако, что ответ Зайфера ниже является более элегантным решением этого вопроса.
isBeforeFirst()
чтобы проверить, есть ли какие-либо строки, возвращаемые без перемещения курсора, а затем продолжить работу в обычном режиме.
Предполагая, что вы работаете с вновь возвращенным ResultSet
, курсор которого направлен перед первой строкой, более простой способ проверить это - просто позвонить isBeforeFirst()
. Это исключает необходимость повторного отслеживания, если данные должны быть прочитаны.
Как объяснено в документации , это возвращает false, если курсор находится не перед первой записью, или если в ResultSet нет строк .
if (!resultSet.isBeforeFirst() ) {
System.out.println("No data");
}
Обычно вы делаете что-то вроде этого:
while ( resultSet.next() ) {
// Read the next item
resultSet.getString("columnName");
}
Если вы хотите сообщить о пустом наборе, добавьте переменную, считающую прочитанные элементы. Если вам нужно прочитать только один элемент, то ваш код адекватен.
Чтобы быть полностью уверенным, скорее набор результатов пуст или нет независимо от позиции курсора, я бы сделал что-то вроде этого:
public static boolean isMyResultSetEmpty(ResultSet rs) throws SQLException {
return (!rs.isBeforeFirst() && rs.getRow() == 0);
}
Эта функция вернет true, если ResultSet пуст, и false, если нет, или выдает SQLException, если этот ResultSet закрыт / неинициализирован.
Лучше всего использовать 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 (). Это не лучшее решение, если у вас нет типа «только вперед» .
Есть метод с именем " .first () ". Это менее излишне, чтобы получить точно такой же результат. Вы проверяете, есть ли что-то в вашем «наборе результатов» и не перемещаете курсор.
В документации говорится: «(...) false, если в наборе результатов нет строк ».
if(rs.first()){
//do stuff
}
Вы также можете просто вызвать isBeforeFirst (), чтобы проверить, есть ли какие-либо строки, возвращенные без перемещения курсора, а затем продолжить работу в обычном режиме. - SnakeDoc 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 ()" не так уж и сложно.
Это сработало бы, если вы хотите увидеть, есть ли какие-либо строки в результирующем наборе да.
Обратите внимание, что он next()
всегда переходит к следующему ряду, поэтому, если вы планируете делать какие-либо чтения из набора результатов, вы должны принять это во внимание.
Обычное использование с ResultSet (при простом чтении):
while (resultSet.next())
{
... read from the row here ...
}
Что, очевидно, не будет работать правильно, если вы next()
уже вызывали один раз, чтобы проверить, был ли набор результатов пуст, так что следите за этим. Хотя существуют методы для «резервного копирования», они не поддерживаются для всех типов наборов результатов.
if(resultSet.first) {
} else {
system.out.println("No raw or resultSet is empty");
}
Потому что, если ResultSet не имеет raw, тогда resultSet.first
возвращает false.
Лучше всего проверить первую строку, чтобы при попытке получить данные вы могли избежать ошибки пропуска строки. Примерно так: if (! ResultSet.first ()) {System.out.println ("нет данных"); }
С помощью 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";
Я пытался установить текущую строку в первый индекс (имеет дело с первичными ключами). Я бы предложил
if(rs.absolute(1)){
System.out.println("We have data");
} else {
System.out.println("No data");
}
Когда ResultSet заполнен, он указывает на перед первой строкой. При установке в первую строку (обозначенную rs.absolute(1)
) он вернет истину, означающую, что он был успешно помещен в строку 1, или ложь, если строка не существует. Мы можем экстраполировать это на
for(int i=1; rs.absolute(i); i++){
//Code
}
который устанавливает текущую строку в положение i и потерпит неудачу, если строка не существует. Это просто альтернативный метод
while(rs.next()){
//Code
}
Я создал следующий метод, чтобы проверить, является ли 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);
Я думаю, что самый простой способ проверить набор результатов - через 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
Для меня проверка "если (rs.getRow ()! = 0)", кажется, работает просто отлично.
вы можете сделать что-то вроде этого
boolean found = false;
while ( resultSet.next() )
{
found = true;
resultSet.getString("column_name");
}
if (!found)
System.out.println("No Data");
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
является лучшим вариантом.
Первоначально объект набора результатов (rs) указывает на BFR (до первой записи). Как только мы используем rs.next (), курсор указывает на первую запись, а rs содержит «true». Используя цикл while, вы можете распечатать все записи таблицы. После того, как все записи получены, курсор перемещается в ALR (после последней записи), и он будет установлен в ноль. Давайте рассмотрим, что в таблице 2 записи.
if(rs.next()==false){
// there are no records found
}
while (rs.next()==true){
// print all the records of the table
}
Вкратце, мы также можем записать условие как while (rs.next ()).