首页 后端开发 C#.Net教程 用Hibernate实现分页查询

用Hibernate实现分页查询

Dec 20, 2016 pm 04:39 PM
Oracle 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语句。
  
  然后来看net.sf.hibernate.dialect.MySQLDialect:
  
     代码:
     public boolean supportsLimit() {
      return true;
     }
     public String getLimitString(String sql) {
      StringBuffer pagingSelect = new StringBuffer(100);
      pagingSelect.append(sql);
      pagingSelect.append(" limit ?, ?");
      return pagingSelect.toString();
     }
  
  这是MySQL的专用分页语句,再来看net.sf.hibernate.dialect.Oracle9Dialect:
  
     代码:
     public boolean supportsLimit() {
      return true;
     }
  
     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。
  
  除此之外,Interbase,PostgreSQL,HSQL也支持分页的sql语句,在相应的Dialect里面,大家自行参考。
  
  如果数据库不支持分页的SQL语句,那么根据在配置文件里面#hibernate.jdbc.use_scrollable_resultset true默认是true,如果你不指定为false,那么Hibernate会使用JDBC2.0的scrollableresult来实现分页,看Loader第430行以下:
  
     代码:
     if ( session.getFactory().useScrollableResultSets() ) {
      // we can go straight to the first required row
      rs.absolute(firstRow);
     }
     else {
      // we need to step through the rows one row at a time (slow)
      for ( int m=0; m     }
  
  如果支持scrollable result,使用ResultSet的absolute方法直接移到查询起点,如果不支持的话,使用循环语句,rs.next一点点的移过去。
  
  可见使用Hibernate,在进行查询分页的操作上,是具有非常大的灵活性,Hibernate会首先尝试用特定数据库的分页sql,如果没用,再尝试Scrollable,如果不行,最后采用rset.next()移动的办法。
  
  在查询分页代码中使用Hibernate的一大好处是,既兼顾了查询分页的性能,同时又保证了代码在不同的数据库之间的可移植性。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

SpringBoot项目里怎么集成Hibernate SpringBoot项目里怎么集成Hibernate May 18, 2023 am 09:49 AM

在SpringBoot项目中集成Hibernate前言Hibernate是一个流行的ORM(对象关系映射)框架,它可以将Java对象映射到数据库表,从而方便地进行持久化操作。在SpringBoot项目中,集成Hibernate可以帮助我们更轻松地进行数据库操作,本文将介绍如何在SpringBoot项目中集成Hibernate,并提供相应的示例。1.引入依赖在pom.xml文件中引入以下依赖:org.springframework.bootspring-boot-starter-data-jpam

Java错误:Hibernate错误,如何处理和避免 Java错误:Hibernate错误,如何处理和避免 Jun 25, 2023 am 09:09 AM

Java是一种面向对象编程语言,它被广泛地应用于软件开发领域。Hibernate是一种流行的Java持久化框架,它提供了一种简单且高效的方式来管理Java对象的持久化。然而,开发过程中经常会遇到Hibernate错误,这些错误可能会导致程序的异常终止或者不稳定。如何处理和避免Hibernate错误成为了Java开发者必须掌握的能力。本文将介绍一些常见的Hib

hibernate和mybatis有哪些区别 hibernate和mybatis有哪些区别 Jan 03, 2024 pm 03:35 PM

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。详细介绍:1、实现方式,Hibernate是一个完整的对象/关系映射解决方案,将对象与数据库表进行映射,MyBatis则需要开发者手动编写SQL语句以及ResultMap;2、性能,Hibernate在开发速度上可能比MyBatis快,因为Hibernate简化了DAO层等等。

Java Hibernate中一对多和多对多关系的映射方式是什么 Java Hibernate中一对多和多对多关系的映射方式是什么 May 27, 2023 pm 05:06 PM

Hibernate的一对多和多对多Hibernate是一个优秀的ORM框架,它简化了Java应用程序与关系型数据库之间的数据访问。在Hibernate中,我们可以使用一对多和多对多的关系来处理复杂的数据模型。Hibernate的一对多在Hibernate中,一对多关系是指一个实体类对应多个另一个实体类。比如,一个订单(Order)可以对应多个订单项(OrderItem),一个用户(User)可以对应多个订单(Order)。要在Hibernate中实现一对多关系,需要在实体类中定义一个集合属性来存

如何在Hibernate中执行批量插入更新操作? 如何在Hibernate中执行批量插入更新操作? Aug 27, 2023 pm 11:17 PM

在本文中,我们将看到如何在Hibernate中执行批量插入/更新。每当我们执行一条sql语句时,我们都是通过对数据库进行网络调用来完成的。现在,如果我们必须向数据库表中插入10个条目,那么我们必须进行10次网络调用。相反,我们可以通过使用批处理来优化网络调用。批处理允许我们在单个网络调用中执行一组SQL语句。为了理解和实施这一点,让我们定义我们的实体−@EntitypublicclassParent{@Id@GeneratedValue(strategy=GenerationType.AUTO)

深入了解Java框架技术栈:探索Spring MVC、Hibernate、MyBatis等常用Java框架 深入了解Java框架技术栈:探索Spring MVC、Hibernate、MyBatis等常用Java框架 Dec 26, 2023 pm 12:50 PM

Java框架技术栈:介绍常用的Java框架,如SpringMVC、Hibernate、MyBatis等随着Java的不断发展,越来越多的框架被开发出来以简化开发过程。其中,SpringMVC、Hibernate、MyBatis等是Java开发中最常用的框架之一。本文将介绍这些框架的基本概念和使用方法,帮助读者更好地理解和应用这些框架。第一,我们来介绍Sp

Java语言中的Hibernate框架介绍 Java语言中的Hibernate框架介绍 Jun 10, 2023 am 11:35 AM

Hibernate是一个开放源码的ORM框架,它将关系型数据库和Java程序之间的数据映射相互绑定,这样可以使开发人员更方便地访问数据库中的数据。使用Hibernate框架可以大量减少编写SQL语句的工作,提高应用程序的开发效率和可重用性。下面从以下几个方面来介绍Hibernate框架。一、Hibernate框架的优点对象关系映射,隐藏数据库访问细节,使开发

Hibernate二级缓存是如何工作的? Hibernate二级缓存是如何工作的? Sep 14, 2023 pm 07:45 PM

缓存有助于减少执行查询时的数据库网络调用。一级缓存与会话链接。它是隐式实现的。一级缓存存在直到会话对象存在为止。一旦会话对象终止/关闭,将会有没有缓存对象。二级缓存适用于多个会话对象。它是链接的与会话工厂。二级缓存对象可供所有会话使用单会话工厂。当特定会话发生时,这些缓存对象将被终止工厂已关闭。实现二级缓存我们需要添加以下依赖项才能使用二级缓存。<!--https://mvnrepository.com/artifact/net.sf.ehcache/ehcache--><de

See all articles