Набір результатів не має методу hasNext. Я хочу перевірити, чи має результат resultSet якесь значення
це правильний шлях
if (!resultSet.next() ) {
System.out.println("no data");
}
Набір результатів не має методу hasNext. Я хочу перевірити, чи має результат resultSet якесь значення
це правильний шлях
if (!resultSet.next() ) {
System.out.println("no data");
}
Відповіді:
Це правильно, спочатку ResultSet
курсор вказує на перший рядок, якщо перший дзвінок next()
повертається, false
тоді в папці не було даних ResultSet
.
Якщо ви використовуєте цей метод, вам, можливо, доведеться зателефонувати beforeFirst()
одразу після його скидання, оскільки він розмістився повз перший рядок зараз.
Слід зазначити, що відповідь Сейфера нижче є більш елегантним рішенням цього питання.
isBeforeFirst()
щоб перевірити, чи є рядки, повернуті без просування курсору, а потім продовжити нормально.
Якщо припустити, що ви працюєте з нещодавно поверненим ResultSet
, курсор якого вказує перед першим рядом, простішим способом перевірити це - просто зателефонувавши isBeforeFirst()
. Це дозволяє уникнути повторного відстеження, якщо дані потрібно читати.
Як пояснено в документації , це повертає помилку, якщо курсор не знаходиться до першої записи або якщо у 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);
}
Ця функція повернеться істинною, якщо ResultSet порожній, помилковим, якщо ні, або кинутим 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 немає сировини, то resultSet.first
повертається false.
Найкраще зробити це - перевірити перший рядок, щоб, коли ви збираєтесь отримати дані, ви змогли уникнути помилки пропуску рядка. Щось на зразок: if (! ResultSet.first ()) {System.out.println ("немає даних"); }
Використовуючи resultSet.next (), ви можете легко отримати результат, будь то результат, що містить будь-яке значення чи ні
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
Для мене встановіть прапорець "if (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 ()).