zoukankan      html  css  js  c++  java
  • 基于Hibernate分页原理的Oracle专用高效万能分页控件


    打字麻烦。大家看flash吧。

    Hibernate 可以实现分页查询,例如:

    从第2万条开始取出100条记录

    Query q = session.createQuery("from Cat as c");
    q.setFirstResult(20000);
    q.setMaxResults(100);
    List l = q.list();

    那么Hibernate底层如何实现分页的呢?实际上Hibernate的查询定义在net.sf.hibernate.loader.Loader这个类里面,仔细阅读该类代码,就可以把问题彻底搞清楚。

    Hibernate2.0.3的Loader源代码第480行以下:

    if (useLimit) sql = dialect.getLimitString(sql);       
    PreparedStatement st = session.getBatcher().prepareQueryStatement(sql, scrollable);

    如果相应的数据库定义了限定查询记录的sql语句,那么直接使用特定数据库的sql语句。
    public String getLimitString(String sql) {
      StringBuffer pagingSelect = new StringBuffer(100);
      pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");
      pagingSelect.append(sql);
      pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?");
      return pagingSelect.toString();
    }

    Oracle采用嵌套3层的查询语句结合rownum来实现分页,这在Oracle上是最快的方式,如果只是一层或者两层的查询语句的rownum不能支持order by。

    下载flash
    http://218.75.77.154/zfj/word/TzhPager.swf

    下载控件自已玩玩。(请不要用于商业开发,本版本目前仅限技术研究)
    http://218.75.77.154/zfj/word/TzhPager.dll
    年后,把控件的代码再理一理。打算把sql server ,access的分页也都整合到一起,因为目前我都是分开写的。每个也就1000来行代码,应该可以合到一块。
    到时看大家的回贴热情了。该共享就共享,该开源就开源。大过年的,还在写技术贴,无聊呀。

  • 相关阅读:
    C# 从服务器下载文件
    不能使用联机NuGet 程序包
    NPOI之Excel——合并单元格、设置样式、输入公式
    jquery hover事件中 fadeIn和fadeOut 效果不能及时停止
    UVA 10519 !! Really Strange !!
    UVA 10359 Tiling
    UVA 10940 Throwing cards away II
    UVA 10079 Pizze Cutting
    UVA 763 Fibinary Numbers
    UVA 10229 Modular Fibonacci
  • 原文地址:https://www.cnblogs.com/tongzhenhua/p/103685.html
Copyright © 2011-2022 走看看