Java ResultSet cara memeriksa apakah ada hasil

311

Resultset tidak memiliki metode untuk hasNext. Saya ingin memeriksa apakah resultSet memiliki nilai

apakah ini cara yang benar

if (!resultSet.next() ) {
    System.out.println("no data");
} 
kal
sumber
2
Untuk pembaca masa depan seperti saya: jawaban yang membantu saya adalah dari Felype dan Dermot Doherty
Benj

Jawaban:

238

Itu benar, awalnya ResultSetkursor menunjuk ke sebelum baris pertama, jika panggilan pertama next()kembali falsemaka tidak ada data di ResultSet.

Jika Anda menggunakan metode ini, Anda mungkin harus beforeFirst()segera menelepon untuk meresetnya, karena sudah diposisikan melewati baris pertama sekarang.

Namun perlu dicatat, bahwa jawaban Seifer di bawah ini adalah solusi yang lebih elegan untuk pertanyaan ini.

tanpa tujuan
sumber
37
Namun perlu diingat, jika ada baris, setelah tes itu Anda akan menunjuk ke baris pertama. Jadi, pastikan Anda tidak melewatkan satu baris pun.
Matthew Flaschen
1
Poin yang baik bahwa kursor (pointer) menunjuk pada baris pertama
JohnMerlino
@ MatthewFlaschen, Anda benar, untuk menyelesaikan masalah lewati baris pertama, saya menggunakan do {...} while (rs.next);
Israel
8
Anda juga bisa langsung menelepon isBeforeFirst()untuk menguji apakah ada baris yang dikembalikan tanpa memajukan kursor, lalu lanjutkan secara normal.
SnakeDoc
528

Dengan asumsi Anda bekerja dengan ResultSetkursor yang baru dikembalikan yang menunjuk sebelum baris pertama, cara yang lebih mudah untuk memeriksa ini adalah dengan menelepon saja isBeforeFirst(). Ini menghindari harus kembali melacak jika data akan dibaca.

Seperti dijelaskan dalam dokumentasi , ini mengembalikan false jika kursor tidak sebelum rekaman pertama atau jika tidak ada baris di ResultSet .

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

 

Seifer
sumber
15
Terima kasih, ya saya tahu tetapi saya mengalami masalah yang sama dan tidak senang dengan tampilan bergerak maju untuk memeriksa lalu mundur untuk membaca. Saya pikir solusi sederhana ini akan bermanfaat bagi orang lain yang berada dalam situasi yang sama juga.
Seifer
5
Perhatikan bahwa, setidaknya untuk DB2, set hasil harus tipe "scrollable". Ini dapat diatur saat Anda membuat pernyataan yang akan dieksekusi.
Laurence Dougal Myers
1
Jawaban Felype di bawah ini lebih lengkap
Tom Howard
Dari Dokumentasi Oracle: Catatan: Dukungan untuk metode isBeforeFirst adalah opsional untuk ResultSets dengan tipe set hasil TYPE_FORWARD_ONLY
emi-le
52

Anda selalu bisa melakukan yang berikutnya di depan, dan hanya melakukan pemeriksaan post loop

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

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

Anda biasanya akan melakukan sesuatu seperti ini:

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

Jika Anda ingin melaporkan set kosong, tambahkan variabel yang menghitung item yang dibaca. Jika Anda hanya perlu membaca satu item, maka kode Anda memadai.

kgiannakakis
sumber
16

Agar benar-benar yakin bahwa resultset kosong atau tidak terlepas dari posisi kursor, saya akan melakukan sesuatu seperti ini:

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

Fungsi ini akan mengembalikan true jika ResultSet kosong, false jika tidak atau melempar SQLException jika ResultSet ditutup / tidak diinisialisasi.

Felype
sumber
12

Terbaik untuk menggunakan ResultSet.next () bersama dengan sintaks do {...} while () untuk ini.

Panggilan "periksa untuk hasil apa saja" ResultSet.next () memindahkan kursor ke baris pertama, jadi gunakan sintaks do {...} while () untuk memproses baris itu sambil terus memproses baris yang tersisa yang dikembalikan oleh loop.

Dengan cara ini Anda bisa memeriksa hasil apa pun, sementara pada saat yang sama juga memproses hasil apa pun yang dikembalikan.

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());
}
Dermot Doherty
sumber
8

Menurut jawaban yang paling layak, saran adalah menggunakan "isBeforeFirst ()". Itu bukan solusi terbaik jika Anda tidak memiliki "tipe forward only" .

Ada metode yang disebut " .first () ". Kurang banyak kerja keras untuk mendapatkan hasil yang sama persis. Anda memeriksa apakah ada sesuatu di "resultset" Anda dan tidak memajukan kursor Anda.

Dokumentasi menyatakan: "(...) false jika tidak ada baris di set hasil ".

if(rs.first()){
    //do stuff      
}

Anda juga dapat memanggil isBeforeFirst () untuk menguji apakah ada baris yang dikembalikan tanpa memajukan kursor, kemudian lanjutkan secara normal. - SnakeDoc 2 Sep 14 'jam 19:00

Namun, ada perbedaan antara "isBeforeFirst ()" dan "first ()". Pertama menghasilkan pengecualian jika dilakukan pada resultset dari tipe "forward only".

Bandingkan dua bagian lemparan: 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 ()

Oke, pada dasarnya ini berarti Anda harus menggunakan "isBeforeFirst" selama Anda memiliki tipe "forward only". Kalau tidak, itu kurang berlebihan untuk menggunakan "first ()".

OddDev
sumber
1
Bagaimana "kurang boros" untuk mendapatkan hasil yang sama persis? Menurut saya tujuan first () adalah memindahkan kursor ke baris pertama jika belum ada (dan mengembalikan true jika berhasil). isBeforeFirst hanya fungsi diagnostik murni dan tampaknya lebih cocok untuk tujuan penulis. Plus, cara first () adalah worded, ia mengembalikan true selama itu "pada baris yang valid" ... yang aneh karena orang akan berpikir itu akan dituliskan sebagai "pada baris pertama". Bagi saya, saya tidak melihat keuntungan menggunakan first () dalam skenario ini kecuali jika kursor Anda telah maju dan Anda ingin membawanya kembali ke awal.
Jon
5

Itu akan berhasil jika Anda ingin melihat apakah ada baris di set hasil ya.

Perhatikan bahwa next()selalu pindah ke baris berikutnya, jadi jika Anda berencana melakukan pembacaan dari set hasil, Anda harus mempertimbangkannya.

Penggunaan biasa dengan ResultSet (ketika hanya membaca) adalah:

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

Yang jelas tidak akan berfungsi dengan benar jika Anda dipanggil next()sekali untuk memeriksa apakah hasil yang disetel kosong, jadi waspadalah. Meskipun ada metode untuk "membuat cadangan", mereka tidak didukung untuk semua jenis set hasil.

Nuoji
sumber
5

Saya yakin ini adalah bacaan yang praktis dan mudah dibaca.

        if (res.next()) {
            do {

                // successfully in. do the right things.

            } while (res.next());
        } else {
           // no results back. warn the user.
        }
JSBach
sumber
2
if (!resultSet.isAfterLast() ) {    
System.out.println("No data"); 
} 

isAfterLast() juga mengembalikan false untuk hasil yang kosong, tetapi karena kursor ada sebelum baris pertama, metode ini tampaknya lebih jelas.

Nick Warke
sumber
2
if(resultSet.first) {

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

Karena jika ResultSet tidak memiliki mentah maka resultSet.firstmengembalikan false.

pengguna868927
sumber
Tapi itu memindahkan kursor ke baris pertama yang tidak perlu, dan itu dapat membingungkan penggunaan lebih lanjut dari objek "reset" ob dan mungkin kehilangan data
Tigran Babajanyan
Meskipun ini terlihat lebih baik, itu tidak akan bekerja pada hasil kursor maju hanya.
eliteproxy
1

Hal terbaik untuk dilakukan adalah memeriksa baris pertama sehingga ketika Anda berniat untuk mendapatkan data, Anda dapat menghindari kesalahan melewatkan satu baris. Sesuatu seperti: if (! ResultSet.first ()) {System.out.println ("no data"); }

Anthony Oyovwe
sumber
1

Dengan menggunakan resultSet.next () Anda dapat dengan mudah mendapatkan hasilnya, apakah resultSet mengandung nilai apa pun atau tidak

ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
 //resultSet contain some values
else
 // empty resultSet
Ram72119
sumber
Jangan ulangi jawaban yang ada.
james.garriss
1
ResultSet result = stmt.executeQuery(sqlQuery);
if (!result.next())
    status = "ERROR";
else
    status = "SUCCESS";
Deepu Surendran
sumber
1

Saya telah mencoba untuk mengatur baris saat ini ke indeks pertama (berurusan dengan kunci utama). saya akan menyarankan

if(rs.absolute(1)){
    System.out.println("We have data");
} else {
    System.out.println("No data");
}

Ketika ResultSet diisi, itu menunjuk ke sebelum baris pertama. Ketika mengaturnya ke baris pertama (ditunjukkan oleh rs.absolute(1)), ia akan mengembalikan true yang menunjukkan bahwa ia berhasil ditempatkan di baris 1, atau false jika baris itu tidak ada. Kami dapat memperkirakan ini untuk

for(int i=1; rs.absolute(i); i++){
    //Code
}

yang mengatur baris saat ini ke posisi i dan akan gagal jika baris tidak ada. Ini hanyalah metode alternatif untuk

while(rs.next()){
    //Code
}
Andrew
sumber
Apa jawabanmu?
CMedina
1

Saya membuat metode berikut untuk memeriksa apakah ResultSet kosong.

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;
    }
}

Sangat penting untuk memiliki pertimbangan berikut:

Objek CallableStatement harus ditetapkan untuk membiarkan objek ResultSet pergi di akhir dan kembali ke atas.

TYPE_SCROLL_SENSITIVE : Objek ResultSet dapat bergeser di akhir dan kembali ke atas. Selanjutnya dapat menangkap perubahan terakhir.

CONCUR_READ_ONLY : Kita dapat membaca data objek ResultSet, tetapi tidak dapat memperbarui.

CallableStatement proc = dbconex.prepareCall(select, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
Cristian
sumber
1

Saya pikir cara termudah untuk memeriksa set hasil adalah melalui CollectionUtils di bawah paket org.apache.commons.collections.CollectionUtils

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

Ini akan memeriksa kondisi hasil nol dan kosong yang ditetapkan.

Untuk informasi lebih detail Anda dapat merujuk ke dokumen berikut. KoleksiUtils

Mitul Maheshwari
sumber
1
ResultSet bukan Koleksi.
Joachim Lous
1

Mengapa tidak menggunakan 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

Bagi saya periksa "jika (rs.getRow ()! = 0)" tampaknya berfungsi dengan baik.

stiebrs
sumber
0

Anda dapat melakukan sesuatu seperti ini

boolean found = false;

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

if (!found)
    System.out.println("No Data");
Mohamed EL-Shabrawy
sumber
1
WAAAY terlalu rumit.
jordaniac89
0
ResultSet rs = rs.executeQuery();
if(rs.next())
{
  rs = rs.executeQuery();
  while(rs.next())
  {
    //do code part
  }
}
else
{
  //else if no result set
}

Lebih baik mengeksekusi query karena ketika kita memanggil if(rs.next()){....}baris pertama ResultSet akan dieksekusi dan setelah itu di dalam while(rs.next()){....}kita akan mendapatkan hasil dari baris berikutnya. Jadi saya pikir eksekusi ulang query di dalam ifadalah pilihan yang lebih baik.

Arpit Trivedi
sumber
5
-1 Ini bukan opsi yang lebih baik. Mengapa meminta database dua kali? Bagaimana jika data berubah secara drastis di antara panggilan? Ini sia-sia.
Toby Caulk
-2

Awalnya, objek set hasil (rs) menunjuk ke BFR (sebelum catatan pertama). Setelah kita menggunakan rs.next (), kursor menunjuk ke catatan pertama dan rs memegang "true". Menggunakan loop sementara Anda bisa mencetak semua catatan tabel. Setelah semua catatan diambil, kursor bergerak ke ALR (Setelah catatan terakhir) dan akan diatur ke nol. Mari kita perhatikan bahwa ada 2 catatan dalam tabel.

if(rs.next()==false){
    // there are no records found
    }    

while (rs.next()==true){
    // print all the records of the table
    }

Singkatnya, kita juga dapat menuliskan kondisi sebagai while (rs.next ()).

Siwa
sumber
3
Loop sementara Anda tidak akan mendapatkan kesempatan untuk beroperasi di baris pertama yang dikembalikan, yang tampaknya merupakan kesalahan yang agak fatal dengan pendekatan ini. Ada banyak saran di atas yang lebih baik dari yang ini.
Jules