Oracle 和分页

标签 oracle hibernate oracle10g pagination top-n

在 MySql 中,可以使用 LIMIT 使用单个 SQL 语句轻松实现分页的概念。条款类似于以下内容。

SELECT country_id, country_name 
FROM country c 
ORDER BY country_id DESC 
LIMIT 4, 5;

它将检索从 5 开始的行至 10在 SQL 查询检索的结果集中。

在 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();

但是当我简单地将 JDBC 连接与 Oracle 一样使用时,
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() ?或者实现此目的的唯一方法是使用指定的子查询。

最佳答案

因为“不”也是一个答案:

不幸的是,您将不得不使用子查询方法。我个人会使用带有等级的那个(第二个)。

关于Oracle 和分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13221912/

相关文章:

mysql - 将两个字段(相互依赖)关联到另一个表中的同一字段

java - JPA/hibernate 大集合

java - Oracle 中的什么数据类型会映射到 Java long?

java - Oracle jdbc 驱动程序 : implicit statement cache or setPoolable(true)?

sql - 如何在sqlplus中隐藏或抑制日志文件(假脱机文件)的sql查询输出

oracle - SQLDeveloper 是否有像 Toad 这样复制/克隆用户的工具?

sql - 查询日期范围之间有多少周并向他们显示日期

java - 在 PostgreSQL 和 JPA/Hibernate 中使用 Point 类型

java - Hibernate 无法解析带有枚举的类型

perl - 当我从反引号调用 sqlplus 时,为什么 ActivePerl 64 位会崩溃?