Bukankah ini operasi yang sangat mudah? Namun, saya melihat tidak ada metode size()
maupun length()
metode.
Bukankah ini operasi yang sangat mudah? Namun, saya melihat tidak ada metode size()
maupun length()
metode.
Jawaban:
Lakukan SELECT COUNT(*) FROM ...
kueri sebagai gantinya.
ATAU
int size =0;
if (rs != null)
{
rs.last(); // moves cursor to the last row
size = rs.getRow(); // get row id
}
Dalam salah satu kasus, Anda tidak perlu mengulang seluruh data.
select count
?
ResultSet#last()
tidak bekerja pada semua jenis ResultSet
objek, Anda perlu memastikan bahwa Anda menggunakan salah satu dari keduanya ResultSet.TYPE_SCROLL_INSENSITIVE
atauResultSet.TYPE_SCROLL_SENSITIVE
ResultSet rs = ps.executeQuery();
int rowcount = 0;
if (rs.last()) {
rowcount = rs.getRow();
rs.beforeFirst(); // not rs.first() because the rs.next() below will move on, missing the first element
}
while (rs.next()) {
// do your standard per row stuff
}
getRow()
berfungsi untuk TYPE_FORWARD_ONLY
ResultSet, dan beforeFirst()
melempar kesalahan untuk itu. Bukankah jawaban ini salah?
ps=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
Nah, jika Anda memiliki ResultSet
tipeResultSet.TYPE_FORWARD_ONLY
Anda ingin tetap seperti itu (dan tidak beralih ke ResultSet.TYPE_SCROLL_INSENSITIVE
atau ResultSet.TYPE_SCROLL_INSENSITIVE
agar dapat digunakan .last()
).
Saya sarankan hack yang sangat bagus dan efisien, di mana Anda menambahkan baris palsu / palsu pertama di bagian atas yang berisi jumlah baris.
Contoh
Katakanlah permintaan Anda adalah sebagai berikut
select MYBOOL,MYINT,MYCHAR,MYSMALLINT,MYVARCHAR
from MYTABLE
where ...blahblah...
dan output Anda terlihat seperti
true 65537 "Hey" -32768 "The quick brown fox"
false 123456 "Sup" 300 "The lazy dog"
false -123123 "Yo" 0 "Go ahead and jump"
false 3 "EVH" 456 "Might as well jump"
...
[1000 total rows]
Cukup refactor kode Anda ke sesuatu seperti ini:
Statement s=myConnection.createStatement(ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
String from_where="FROM myTable WHERE ...blahblah... ";
//h4x
ResultSet rs=s.executeQuery("select count(*)as RECORDCOUNT,"
+ "cast(null as boolean)as MYBOOL,"
+ "cast(null as int)as MYINT,"
+ "cast(null as char(1))as MYCHAR,"
+ "cast(null as smallint)as MYSMALLINT,"
+ "cast(null as varchar(1))as MYVARCHAR "
+from_where
+"UNION ALL "//the "ALL" part prevents internal re-sorting to prevent duplicates (and we do not want that)
+"select cast(null as int)as RECORDCOUNT,"
+ "MYBOOL,MYINT,MYCHAR,MYSMALLINT,MYVARCHAR "
+from_where);
Output kueri Anda sekarang akan menjadi seperti
1000 null null null null null
null true 65537 "Hey" -32768 "The quick brown fox"
null false 123456 "Sup" 300 "The lazy dog"
null false -123123 "Yo" 0 "Go ahead and jump"
null false 3 "EVH" 456 "Might as well jump"
...
[1001 total rows]
Jadi kamu harus
if(rs.next())
System.out.println("Recordcount: "+rs.getInt("RECORDCOUNT"));//hack: first record contains the record count
while(rs.next())
//do your stuff
ResultSet.TYPE_FORWARD_ONLY
)
int i = 0;
while(rs.next()) {
i++;
}
Saya mendapat pengecualian saat menggunakan rs.last()
if(rs.last()){
rowCount = rs.getRow();
rs.beforeFirst();
}
:
java.sql.SQLException: Invalid operation for forward only resultset
itu karena secara default itu ResultSet.TYPE_FORWARD_ONLY
, yang berarti Anda hanya dapat menggunakanrs.next()
solusinya adalah:
stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet.TYPE_FORWARD_ONLY
ke ResultSet.TYPE_SCROLL_INSENSITIVE
biasanya menimbulkan dalam besar hukuman kinerja.
SELECT COUNT(*) FROM default_tbl
sebelum SELECT COUNT(*) FROM default_tbl
butuh waktu kurang dari 1,5 detik. Saya menguji pada database derby tertanam 10.11.1.1
Cara mendapatkan ukuran ResultSet, Tidak perlu menggunakan ArrayList dll
int size =0;
if (rs != null)
{
rs.beforeFirst();
rs.last();
size = rs.getRow();
}
Sekarang Anda akan mendapatkan ukuran, dan jika Anda ingin mencetak ResultSet, sebelum mencetak menggunakan baris kode berikut juga,
rs.beforeFirst();
[Pertimbangan kecepatan]
Banyak ppl di sini menyarankan ResultSet.last()
tetapi untuk itu Anda perlu membuka koneksi karena ResultSet.TYPE_SCROLL_INSENSITIVE
yang untuk database tertanam Derby hingga 10 kali lebih lambat daripada ResultSet.TYPE_FORWARD_ONLY
.
Menurut tes mikro saya untuk database Derby dan H2 yang tertanam, secara signifikan lebih cepat untuk menelepon SELECT COUNT(*)
sebelum SELECT Anda.
Ini adalah cara sederhana untuk melakukan rows-count.
ResultSet rs = job.getSearchedResult(stmt);
int rsCount = 0;
//but notice that you'll only get correct ResultSet size after end of the while loop
while(rs.next())
{
//do your other per row stuff
rsCount = rsCount + 1;
}//end while
String sql = "select count(*) from message";
ps = cn.prepareStatement(sql);
rs = ps.executeQuery();
int rowCount = 0;
while(rs.next()) {
rowCount = Integer.parseInt(rs.getString("count(*)"));
System.out.println(Integer.parseInt(rs.getString("count(*)")));
}
System.out.println("Count : " + rowCount);
Saya memeriksa nilai runtime dari antarmuka ResultSet dan menemukan itu adalah ResultSetImpl cukup banyak sepanjang waktu. ResultSetImpl memiliki metode yang disebutgetUpdateCount()
yang mengembalikan nilai yang Anda cari.
Contoh kode ini harus cukup:
ResultSet resultSet = executeQuery(sqlQuery);
double rowCount = ((ResultSetImpl)resultSet).getUpdateCount()
Saya menyadari bahwa downcasting umumnya merupakan prosedur yang tidak aman tetapi metode ini belum mengecewakan saya.
java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.DelegatingResultSet cannot be cast to com.mysql.jdbc.ResultSetImpl
Hari ini, saya menggunakan logika ini mengapa saya tidak tahu menghitung RS.
int chkSize = 0;
if (rs.next()) {
do { ..... blah blah
enter code here for each rs.
chkSize++;
} while (rs.next());
} else {
enter code here for rs size = 0
}
// good luck to u.
theStatement=theConnection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet theResult=theStatement.executeQuery(query);
//Get the size of the data returned
theResult.last();
int size = theResult.getRow() * theResult.getMetaData().getColumnCount();
theResult.beforeFirst();
Saya mengalami masalah yang sama. Menggunakan ResultSet.first()
cara ini tepat setelah eksekusi menyelesaikannya:
if(rs.first()){
// Do your job
} else {
// No rows take some actions
}
Dokumentasi ( tautan ):
boolean first() throws SQLException
Memindahkan kursor ke baris pertama di
ResultSet
objek ini .Pengembalian:
true
jika kursor berada pada baris yang benar;false
jika tidak ada baris di set hasilMelempar:
SQLException
- jika terjadi kesalahan akses database; metode ini dipanggil pada himpunan hasil tertutup atau jenis himpunan hasil adalahTYPE_FORWARD_ONLY
SQLFeatureNotSupportedException
- jika driver JDBC tidak mendukung metode iniSejak:
1.2
Pendekatan termudah, Jalankan Hitung Count (*), lakukan resultSet.next () untuk menunjuk ke baris pertama dan kemudian lakukan resultSet.getString (1) untuk mendapatkan hitungan. Kode:
ResultSet rs = statement.executeQuery("Select Count(*) from your_db");
if(rs.next()) {
int count = rs.getString(1).toInt()
}
Beri nama pada kolom ..
String query = "SELECT COUNT(*) as count FROM
Referensi kolom itu dari objek ResultSet ke int dan lakukan logika Anda dari sana ..
PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1, item.getProductId());
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
int count = resultSet.getInt("count");
if (count >= 1) {
System.out.println("Product ID already exists.");
} else {
System.out.println("New Product ID.");
}
}