Java 使用JdbcTemplate和Oracle11g/H2进行Web分页,而不使用可滚动的结果集

Java 使用JdbcTemplate和Oracle11g/H2进行Web分页,而不使用可滚动的结果集,java,oracle11g,jsp-tags,jdbctemplate,Java,Oracle11g,Jsp Tags,Jdbctemplate,这肯定已经做了一千次了,但是我在网上找不到Java代码 我正在编写一个网页,其中显示了Oracle11g中的列表,由Dao使用JdbcTemplate检索 它本质上是一个审计日志,带有一个日期搜索字段,以显示该日期和以前日期的日志条目 我的审计日志服务类将调用Dao并将返回的行数限制为100,并且必须计算出要在查询中指定的最新日期。然后它将把审计日志javabeans列表传回MVC层 这是我为SQL所做的最大努力,为了进行测试,SQL必须与H2 Oracle模式兼容。这排除了行数函数。lates

这肯定已经做了一千次了,但是我在网上找不到Java代码

我正在编写一个网页,其中显示了Oracle11g中的列表,由Dao使用JdbcTemplate检索

它本质上是一个审计日志,带有一个日期搜索字段,以显示该日期和以前日期的日志条目

我的审计日志服务类将调用Dao并将返回的行数限制为100,并且必须计算出要在查询中指定的最新日期。然后它将把审计日志javabeans列表传回MVC层

这是我为SQL所做的最大努力,为了进行测试,SQL必须与H2 Oracle模式兼容。这排除了行数函数。latestDate和maxRows是参数

    SELECT * FROM (
                SELECT * FROM T_ETL_AUDIT_LOG 
                WHERE LOG_TIMESTAMP  < ?latestDate 
            ) WHERE rownum < ?maxRows;
因此,我需要确定网页上的参数是什么,例如lastDate、previous、next,审计日志服务算法必须使用date=Now和previous page、next page来处理第一个调用,而不会混淆

我还没有为JSP搜索分页标记,所以任何建议都很酷,但这是锦上添花

注意:我没有使用Oracle 12,因此无法使用新的Oracle分页功能


2015-01-20-刚刚更改了标题以排除可滚动结果集解决方案。

JDBCTemplate对分页没有直接帮助。您必须进行查询以处理页码和页面大小。此外,还应进行计数查询

这是一个逐个创建分页组件的解决方案:


这里有一个自定义jsp标记用于分页:

我在客户端使用页码,因此“下一页”和“上一页”按钮传输下一页或上一页的页码。我的服务将页码转换为DAO的previousLastRow和lastRow参数。在用户更改之前,每个页面上的原始搜索日期保持不变

这是针对Oracle的SQL,第2页中的参数替换为,即第101行到第200行:

select * from (
    select ROWNUM as row_num, b.* from (
        select ROWNUM, MY_TIMESTAMP 
        from T_MY_TABLE 
        where MY_TIMESTAMP < TIMESTAMP'2015-01-20 12:12:34'
        and ROWNUM <= 200
        order by MY_TIMESTAMP desc
    ) b 
) where row_num > 100;

首先,你应该尝试一下。从分页开始并不是一门火箭科学,如果你陷入困境,那么你可以回到这里,拿出一些代码来展示。你可能想知道,如果你的数据集可以在同一时间有一个LOG_时间戳,那么你的SQL将无法工作。使用<操作可能意味着跳过rows@Bartdude你让我听起来很懒。我已经研究了一段时间了,甚至在尝试为TDD设计一套测试时,这也让我觉得很重要,这必须是基本的功能,为什么我要花时间重新发明轮子?@MrWiggles我想把日期精确到当天23:59:59.999,并提供一个简单的日期选择器。如果你拿出一整天的所有数据,但是,如果您想限制页面大小并需要获取后续数据,则可能会丢失记录。感谢您的回复,但我使用的是Oracle 11g,因此我不能使用MySQL偏移量和限制SQL格式。我也不能采用您提到的“贪婪”方法,将表中的所有行检索到RS。您的博客链接到的第二篇文章更像是我需要做的。像这样的文章太多了,但没有一篇专门针对这种情况的。不创建滚动查询肯定有原因,所以你应该仔细考虑一下。可滚动查询将解决这个问题,JDBC完全支持这些查询。在每个页面生成循环中,您可以获取每页所需的行数,直到耗尽记录集。在Oracle中使用可滚动的结果集来获取真正大的行数不是一个好主意。数据缓存在客户端,而不是数据库中:它可能导致JVM内存不足错误。