在 MySql 中,分页的概念可以很容易地通过使用如下LIMIT
子句的单个 SQL 语句来实现。
SELECT country_id, country_name
FROM country c
ORDER BY country_id DESC
LIMIT 4, 5;
它将检索SQL 查询检索的结果集中从5
to开始的行。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()
and的方法一样setMaxResults()
?或者实现这一点的唯一方法是使用指定的那些子查询。