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");
}
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");
}
Jawaban:
Itu benar, awalnya ResultSet
kursor menunjuk ke sebelum baris pertama, jika panggilan pertama next()
kembali false
maka 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.
isBeforeFirst()
untuk menguji apakah ada baris yang dikembalikan tanpa memajukan kursor, lalu lanjutkan secara normal.
Dengan asumsi Anda bekerja dengan ResultSet
kursor 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");
}
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.
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.
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());
}
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 ()".
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.
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.
if(resultSet.first) {
} else {
system.out.println("No raw or resultSet is empty");
}
Karena jika ResultSet tidak memiliki mentah maka resultSet.first
mengembalikan false.
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"); }
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
ResultSet result = stmt.executeQuery(sqlQuery);
if (!result.next())
status = "ERROR";
else
status = "SUCCESS";
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
}
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);
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
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.
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");
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 if
adalah pilihan yang lebih baik.
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 ()).