Korzystanie z JDBC i bez szczególnych ram, takich jak Hibernacja lub biblioteki JSTL. (tylko sterownik JDBC mysql-connector-java-5.1.34-bin.jar)
Biorąc pod uwagę tabelę zawierającą od 20 do 25 wierszy iprzygotowane oświadczenie, na którym ustawiłem .setMaxRows (20), w jaki sposób mogę ustalić, że 20 zwróconych wierszy było w rzeczywistości z więcej niż 20 wierszy? (Próbowałem też z ... LIMIT 20 w instrukcji SQL)
Wiem, że robi to JSTL ${myRs.limitedByMaxRows}
dostępne podczas korzystania <sql:query var="myRs" ... maxRows="20">...
ale chciałbym dowiedzieć się, jak można to wykryć w ramach DAO.
Dziękuję za pomoc.
Odpowiedzi:
0 dla odpowiedzi № 1Zajrzałem do źródła złącza MySQL i okazało się, że MysqlIO.readSingleRowSet nie wskazuje, czy zwracany wynik był faktycznie ograniczony przy użyciu setMaxRows
na przygotowanym wyciągu.
Co do JSTL sql
tag i jego implementacja maxRows
, jest to nieco mylące. Właściwie to nie używa .setMaxRows()
na przygotowanym zestawieniu, zwłaszcza że musi ustalić, czy limit został osiągnięty, ale istnieje więcej wierszy, aby móc go ustawić limitedByMaxRows
do true
. Zatem zapytanie wykonane na bazie danych nie jest tak właściwie ograniczony.
Więc rozwiązanie, które wprowadzę w POJO podczas ustawiania .setMaxRows()
następująco:
if (pstmt.getMaxRows() > 0 && rowCount == pstmt.getMaxRows()) {
try ( ResultSet countRs =
conn.createStatement().executeQuery("select count(*) from INVENTORY")
) {
if (countRs.first()) {
limitReached = rowCount < countRs.getInt(1);
}
}
}