LIMIT
MySql では、ページネーションの概念は、次のような句を使用して単一の SQL ステートメントで簡単に実装できます。
SELECT country_id, country_name
FROM country c
ORDER BY country_id DESC
LIMIT 4, 5;
SQLクエリが取得する結果セットで、5
から始まる行を取得します。10
Oracle では、サブクエリで行番号を使用して同じことを達成できるため、次のようにタスクがやや面倒になります。
SELECT country_id, country_name
FROM
(SELECT rownum as row_num, country_id, country_name
FROM
(SELECT country_id, country_name
FROM country
ORDER BY country_id desc)
WHERE rownum <= 10
)
WHERE row_num >=5;
Oracle 10g (またはそれ以降、より高いバージョンについてはわかりません) では、これは次のように多少簡単に行うことができます。
SELECT country_id, country_name
FROM (SELECT country_id, country_name, row_number() over (order by country_id desc) rank
FROM country)
WHERE rank BETWEEN 6 AND 10;
Web アプリケーションのようなアプリケーションに関しては、ほぼすべての場所でページネーションの概念を実装する必要があり、(選択) クエリが実行されるたびにそのような SQL ステートメントを記述するのは面倒な作業になる場合があります。
Java を使用した Web アプリケーションがあるとします。Hibernate フレームワークを使用する場合、Hibernate でサポートされている次のようなメソッドを使用して直接行う方法があります。
List<Country>countryList=session.createQuery("from Country order by countryId desc")
.setFirstResult(4).setMaxResults(5).list();
しかし、単純に Oracle との JDBC 接続を使用すると、
String connectionURL = "jdbc:oracle:thin:@localhost:1521:xe";
Connection connection = null;
Statement statement = null;
ResultSet rs = null;
Class.forName("oracle.jdbc.OracleDriver").newInstance();
connection = DriverManager.getConnection(connectionURL, "root", "root");
statement = connection.createStatement();
rs = statement.executeQuery("SELECT * from country");
この場合の私の質問は、このコードを使用して指定された範囲の行を取得する正確な方法はありますか? 前のケースのようにsetFirstResult()
、 やsetMaxResults()
?などのメソッドを使用します。または、これを達成する唯一の方法は、これらのサブクエリを指定どおりに使用することです。